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);
}
我在我的 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);
}