android - RecyclerView Item Click Listener 与 DataBinding

标签 android data-binding android-recyclerview android-databinding

我已经使用处理任何布局项的所有绑定(bind)的 baseadapter 实现了带有数据绑定(bind)的回收器 View 。

我曾尝试使用方法引用和监听器绑定(bind)来实现每个项目的点击监听器,但我做不到。

这是我的代码。你能给我一个样本吗,这是检测回收站 View 中每个项目的简单方法,我想为每个项目添加点击监听器以用于不同目的。谢谢。

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);
}}

回收站 View 行布局(每个项目)

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

<data>

    <variable
        name="pojo"
        type="com.durbinlabs.databinding.POJO" />


</data>

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">

    <ImageView

        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        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_width="fill_parent"
        android:layout_height="26dip"
        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();
}}

最佳答案

在你的适配器类而不是基础适配器中试试这个

  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();
                }
            }
    );

关于android - RecyclerView Item Click Listener 与 DataBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874441/

相关文章:

java - 来自 SQLite 结果的 Android 自定义 ArrayAdapter

c# - 使用 runat ="server"访问 HTML 元素中的 foreach 变量

c# - WPF Databinding DataTrigger 根据 bool 值改变形状的颜色

java - RecyclerView 项目在刷新后改变大小

java - 如何完全求助于RecyclerView的SortedList

android - RecyclerView 中的 Swipe 和 OnClick 事件

java - Glide 不从 url 加载图像

android - Phonegap Index.html 重置每次启动

android - 想要在来自 http 请求的 android 应用程序中显示泰卢固语内容

读取并绑定(bind)多个 csv 文件