Android: передать лямбду в адаптер утилизатора с помощью android привязки данных - PullRequest
1 голос
/ 07 января 2020

Я использую mvvm и привязку данных в моем проекте. У меня есть представление переработчика и я делаю данные adaptor.my хорошо показанными в представлении переработчика. Теперь я хочу создать слушатель щелчка элемента.

Так что на В конце моего адаптера я создаю интерфейс, подобный этому:

interface MyClickListener {
    void onItemClick(MyEntity myEntity);
}

, после этого я добавил этот слушатель в конструктор моего адаптера:

public class MyRecyclerAdapter extends ListAdapter<MyEntity, MyRecyclerAdapter.ViewHolder> {

    public MyClickListener clickListener;

    public MyRecyclerAdapter(MyClickListener clickListener) {
        super(MyEntity.DIFF_CALLBACK);
        this.clickListener = clickListener;
    } 

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    MyEntity item = getItem(position);
    holder.bind(item,clickListener);
}

, и я отправил свой обратный вызов в представление связывания xml:

private void bind(MyEntity item, MyClickListener clickListener) {
    binding.setEntity(item);
    binding.setClickListener(clickListener);
    binding.executePendingBindings();
}

В xml:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="entity"
            type="com.test.database.myEntity" />
        <variable
            name="clickListener"
            type="com.test.home.MyClickListener" />
    </data>


    <androidx.cardview.widget.CardView
        android:id="@+id/cardview_id"
        android:layout_width="190dp"
        android:layout_height="280dp"
        android:layout_margin="5dp"
        android:clickable="true"
        android:foreground="?android:attr/selectableItemBackground"
        app:cardBackgroundColor="@android:color/white"
        app:cardCornerRadius="10dp"
        app:cardElevation="5dp"
        app:cardUseCompatPadding="true"
        android:onClick="@{() -> clickListener.onItemClick(entity)}">

и я инициализирую этот обратный вызов в моем адаптере:

MyRecyclerAdapter adapter = new MyRecyclerAdapter(myEntity -> {
    Toast.makeText(getContext(), myEntity.getID(), Toast.LENGTH_SHORT).show();
});

Но когда я запускаю приложение, я получил эту ошибку:

error: cannot find symbol class MyClickListener

В чем моя ошибка?

Мне нужно создать класс вместо интерфейса и создать новый объект? Нет способа использовать интерфейс?

1 Ответ

1 голос
/ 07 января 2020

Это проблема, связанная с модификатором доступа вашего interface. Попробуйте изменить его public

public interface MyClickListener {
    void onItemClick(MyEntity myEntity);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...