RecyclerView Item Click Listener with DataBinding
Posted
技术标签:
【中文标题】RecyclerView Item Click Listener with DataBinding【英文标题】: 【发布时间】:2018-04-03 02:54:17 【问题描述】:我已经使用处理任何布局项的所有绑定的 baseadapter 实现了带有数据绑定的回收器视图。
我尝试使用方法引用和监听器绑定来实现每个项目的点击监听器,但我做不到。
这是我的代码。你能给我一个样本,这是检测回收器视图的每个项目的简单方法,我想为每个项目添加点击监听器以用于不同的目的。谢谢。
MyBaseAdapter
public abstract class MyBaseAdapter extends RecyclerView.Adapter<MyBaseAdapter.MyViewHold>
public class MyViewHold extends RecyclerView.ViewHolder implements View.OnClickListener
public ViewDataBinding binding;
Context context;
public MyViewHold(ViewDataBinding binding)
super(binding.getRoot());
this.binding = binding;
context = binding.getRoot().getContext();
binding.getRoot().setOnClickListener(this);
// Here BR.pojo must be matched to layout variable name
//our layout variable was
/*
<variable
name="pojo"
type="com.durbinlabs.databinding.POJO"
/>
*/
public void bind(Object obj)
binding.setVariable(BR.pojo, obj);
binding.setVariable(BR.food, obj);
binding.executePendingBindings();
@Override
public void onClick(View view)
// for all view
@Override
public MyViewHold onCreateViewHolder(ViewGroup parent, int viewType)
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, getLayoutIdForType(viewType)
, parent, false);
return new MyBaseAdapter.MyViewHold(binding);
@Override
public void onBindViewHolder(MyViewHold holder, int position)
holder.bind(getDataAtPosition(position));
Log.d("click", "" + holder.getItemId());
public abstract Object getDataAtPosition(int position);
public abstract int getLayoutIdForType(int viewType);
我的pojo课
public class POJO extends BaseObservable
int img;
String name;
public POJO(int img)
this.img = img;
public void setImg(int img)
this.img = img;
public int getImg()
return img;
public POJO(int img, String name)
this.img = img;
this.name = name;
@Bindable
public String getName()
return name;
public void setName(String name)
this.name = name;
notifyPropertyChanged(BR.name);
回收站视图行布局(每个项目)
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="pojo"
type="com.durbinlabs.databinding.POJO" />
</data>
<RelativeLayout
android:layout_
android:layout_
android:padding="6dip">
<ImageView
android:id="@+id/icon"
android:layout_
android:layout_
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"
android:layout_marginRight="6dip"
android:contentDescription="TODO"
android:onClick="@handlers::imgClick"
android:src="@mipmap/ic_launcher" />
<TextView
android:layout_
android:layout_
android:layout_alignParentRight="true"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/icon"
android:ellipsize="marquee"
android:maxLines="1"
android:text="@pojo.name"
android:textColor="@android:color/black"
android:textSize="12sp" />
</RelativeLayout>
适配器
public class Adapter extends MyBaseAdapter
private List<POJO> itemList;
Context context;
public Adapter(List<POJO> itemList)
this.itemList = itemList;
public Adapter(List<POJO> itemList, Context context)
this.itemList = itemList;
this.context = context;
@Override
public Object getDataAtPosition(int position)
return itemList.get(position);
@Override
public int getLayoutIdForType(int viewType)
return R.layout.rowlayout;
@Override
public int getItemCount()
return itemList.size();
【问题讨论】:
您在MyViewHold
中的@Override public void onClick(View view) // for all view
为空。在里面放一个日志,然后尝试单击您的 recyclerView
中的一项。
【参考方案1】:
在你的适配器类而不是基本适配器中试试这个
holder.binding.getRoot().findViewById(R.id.icon).setOnClickListener(
new View.OnClickListener()
@Override
public void onClick(View view)
Toast.makeText(context, "clicked", Toast.LENGTH_SHORT).show();
);
【讨论】:
如果我们将它与 MVVM 联系起来,那么如何让它在模型类中工作?我认为我们不应该在 MVVM 的情况下使用 findViewById?以上是关于RecyclerView Item Click Listener with DataBinding的主要内容,如果未能解决你的问题,请参考以下文章
RecyclerView Item Click Listener with DataBinding
如何将值从 Item Click RecyclerView 发送到另一个 java 类
RecyclerView与CoordinatorLayout 抽屉效果无法触发的问题