Kotlin setOnClickListener, использующий ссылку на метод, не работает

Мы можем объединить две коллекции, используя sub-запрос mongoDB. Вот пример, Комментарии -

`db.commentss.insert([
  { uid:12345, pid:444, comment:"blah" },
  { uid:12345, pid:888, comment:"asdf" },
  { uid:99999, pid:444, comment:"qwer" }])`

Пользователи -

db.userss.insert([
  { uid:12345, name:"john" },
  { uid:99999, name:"mia"  }])

Суб-запрос MongoDB для JOIN -

`db.commentss.find().forEach(
    function (newComments) {
        newComments.userss = db.userss.find( { "uid": newComments.uid } ).toArray();
        db.newCommentUsers.insert(newComments);
    }
);`

Получить результат из недавно созданная коллекция -

db.newCommentUsers.find().pretty()

Результат -

`{
    "_id" : ObjectId("5511236e29709afa03f226ef"),
    "uid" : 12345,
    "pid" : 444,
    "comment" : "blah",
    "userss" : [
        {
            "_id" : ObjectId("5511238129709afa03f226f2"),
            "uid" : 12345,
            "name" : "john"
        }
    ]
}
{
    "_id" : ObjectId("5511236e29709afa03f226f0"),
    "uid" : 12345,
    "pid" : 888,
    "comment" : "asdf",
    "userss" : [
        {
            "_id" : ObjectId("5511238129709afa03f226f2"),
            "uid" : 12345,
            "name" : "john"
        }
    ]
}
{
    "_id" : ObjectId("5511236e29709afa03f226f1"),
    "uid" : 99999,
    "pid" : 444,
    "comment" : "qwer",
    "userss" : [
        {
            "_id" : ObjectId("5511238129709afa03f226f3"),
            "uid" : 99999,
            "name" : "mia"
        }
    ]
}`

Надеюсь, что это поможет.

1
задан FraK 17 January 2019 в 14:09
поделиться

3 ответа

Фигурные скобки обозначают содержание лямбда-выражения. Kotlin уже передал экземпляр OnClickListener за кулисы и предоставляет вам метод onClick().

Если вы хотите передать прослушиватель, назначенный переменной, используйте круглые скобки:

button.setOnClickListener(clickListener)

Если вы хотите использовать функцию, она такая же, как Java:

button.setOnClickListener(this::clickListener)

fun clickListener(v: View) {}
0
ответ дан TheWanderer 17 January 2019 в 14:09
поделиться

Вы можете сделать это в kotlin. Заменить фигурные скобки на круглые скобки.

btn.setOnClickListener (this::clicklistener)

fun clicklistener(v: View){}
0
ответ дан Chan Myae Aung 17 January 2019 в 14:09
поделиться
1128] Хотя на этот вопрос уже был дан ответ, я хотел бы расширить существующие ответы.

Как уже упоминал Странник, фигурные скобки здесь означают тело лямбды. Kotlin поддерживает размещение обратных вызовов вне регулярных скобок .

Это:

button.setOnClickListener {clickListener()}

Равно равно:

button.setOnClickListener({clickListener()})

, что равно:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        clickListener();
    }
});

Или (только Java 8) :

button.setOnClickListener(view -> clickListener());

TL; DR: содержимое аргументов функции определяется с помощью (), а лямбда-тела определяются с помощью {} (так же, как с обычными функциями, классами, интерфейсами , так далее.).

Теперь, во-первых, обратный вызов метода onClick принимает аргумент view. Если вы используете автономную функцию, у нее должен быть следующий аргумент:

fun clickListener(view: View) { TODO("Place your listener code here") }

Это основано на именовании - если вы реализуете OnClickListener, просто передайте this в качестве аргумента. У вас уже есть слушатель и функция, поэтому вам не нужно явно определять, что передать. Однако, если вы реализуете OnClickListener, обязательно проверьте идентификатор перед выполнением действия, если у вас есть несколько представлений, использующих его в качестве прослушивателя.

Если вы используете методы, следующее зависит от того, как.

Использование функций var или val

Если ваш обратный вызов определен как:

val listener = {view: View -> 
       TODO()               
    }

Вы можете передать его как аргумент:

button.setOnClickListener(listener)
[1126 ] OnClickListeners

Если у вас есть var onClickListener: OnClickListener, применяются те же функции, что и с функциями var / val.

Использование функции

Если у вас есть fun clickListener, вам придется добавить лямбду, чтобы передать его. Это, как и в случае с Java, использовать ::. Однако вам не нужно явно объявлять область действия, как в Java. Это означает, что любой из них будет работать:

button.setOnClickListener(::clickListener);
button.setOnClickListener(this::clickListener);
// alternatively with a different target, if it's somewhere else. 

Дальнейшее чтение

0
ответ дан Zoe 17 January 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: