Получение элемента данных из RecyclerView onClick - PullRequest
0 голосов
/ 12 января 2019

У меня есть RecyclerView с элементом привязки данных, объявленным в макете для адаптера:

<data>
    <variable
        name="item"
        type="com...myType"/>
    <variable
        name="handlers"
        type="com...myHandlers"/>
</data>
<LinearLayout>
    <TextView
        android:text="@{item.field}" />
    <Button
        android:onClick="@{handlers::onClick}" />
</LinearLayout>

Кажется, все настроено правильно для вызова обработчика onClick, но проблема в том, что единственная подпись, которую он принимает, это

public class MyHandlers
{
    public void onClick(View view)
    {
        // Code
    }
}

Что делает для меня именно то, что он дает, потому что представление, которое он мне дает, это AppCompatButton, который я нажал, чтобы получить onClick, в котором нет информации об элементе с привязкой к данным. Я пытался проверить родителей на пару уровней, но я не вижу ничего, что дало бы мне предмет с привязкой к данным.

Как мне получить привязанный к данным элемент из моего onClick, чтобы я знал, по какому элементу щелкнули?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы используете справочник по методам . При использовании ссылок на методы параметр целевого метода должен соответствовать параметрам используемых слушателей. В этом случае для метода onClick параметром является View, поэтому ваш метод должен иметь View как параметр. Если вы хотите передать что-то еще в обратный вызов, то вы должны использовать привязки слушателя . Об этом в официальной документации 1006 * Подробный пример приведен выше, я не буду это повторять, но я хочу кое-что добавить. Если вам не нужен аргумент view, вам не нужно его передавать. Вы можете объявить это как:

android:onClick="@{() ->  handlers.onClick(item)}"

Конечно, вы должны соответственно изменить тип параметра вашего метода onClick.

0 голосов
/ 12 января 2019

Создайте интерфейс слушателя, например:

1) Создайте следующий интерфейс:

public interface ItemOnClickListener {
     void onClickItem(View v, myType item);
}

2) Измените XML-файл макета элемента следующим образом:

<layout>
<data>
<variable 
    name="listener"
    type="YOUR_PACKAGE_GOES_HERE.ItemOnClickListener" />
</data>

  <Button
       android:onClick="@{(v) -> listener.onClickItem(v, item)}" />

</layout>

3) Реализуйте интерфейс выше в вашем адаптере:

public class MyRecyclerViewAdapter implements ItemOnClickListener 

4) Переопределить метод ItemOnClickListener в вашем адаптере

@Override
public void onClickItem(View v, myType item) {
    // your code goes here
}

5) Наконец, в вашем onBindViewHolder() дайте экземпляру слушателя привязку к данным:

itemBinding.setListener(this);
...