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 抽屉效果无法触发的问题

android RecyclerView嵌套 RecyclerView 子item 和 父item点击事件如何处理

RecyclerView的Item的单击事件

如何彻底更改 recyclerview 中的 item 布局中的某个控件的某个属性