Android:通过 android 数据绑定将 lambda 传递给回收器适配器

Android: pass lambda to recycler adapter by android data binding

我在我的 project.I 上使用 mvvm 和数据绑定,有一个回收器视图,并在回收器视图中显示 adapter.my 数据 fine.Now 我想创建项目点击监听器。

所以在我的适配器结束时,我创建了一个这样的界面:

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

我的错误是什么?

我必须制作 class 而不是界面并制作一个新对象?有没有办法使用接口?

这是一个与您的 interface 的访问修饰符相关的问题。尝试改变它public

public interface MyClickListener {
    void onItemClick(MyEntity myEntity);
}