recyclerView 适配器中的数据绑定 - Android

6 data-binding android android-adapter android-recyclerview android-databinding

dataBinding在我的项目中使用来填充RecyclerView. 我如何处理对项目的点击?

这是我的 XML 布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="listItems"
            type="String" />

        <variable
            name="clickListener"
            type="com.xxxx.xxxx.AdapterStartActivity" />
    </data>

    <android.support.v7.widget.CardView
        android:id="@+id/cardview1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="3dp"
        android:onClick="@{()->clickListener.onCardClick(listItems)}" <=====
        card_view:cardCornerRadius="7dp"
        card_view:cardElevation="7dp"
        card_view:cardMaxElevation="7dp"
        card_view:contentPadding="0dp">

        <TextView
            android:id="@+id/txtTitles"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:gravity="center"
            android:padding="10dp"
            android:text="@{listItems}"
            android:textColor="#000000"
            android:textSize="20dp"
            android:textStyle="bold" />
    </android.support.v7.widget.CardView>
</layout>
Run Code Online (Sandbox Code Playgroud)

onClick在这一行中指定了处理程序:

android:onClick="@{()->clickListener.onCardClick(listItems)}"
Run Code Online (Sandbox Code Playgroud)

下面是我的适配器:

public class AdapterStartActivity extends RecyclerView.Adapter<AdapterStartActivity.ViewHolder> {
    private ListItemActivityStartBinding binding;
    private List<String> listTitle;
    private Context context;

    public AdapterStartActivity(Context context, List<String> listTitle) {
        this.listTitle = listTitle;
        this.context = context;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView txtTitles;

        public ViewHolder(View v) {
            super(v);
            txtTitles = (TextView) v.findViewById(R.id.txtTitles);
        }
    }

    @Override
    public AdapterStartActivity.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.list_item_activity_start, parent, false);
        binding = DataBindingUtil.bind(view);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder Vholder, int position) {
        binding.setListItems(listTitle.get(position));
    }

    @Override
    public int getItemCount() {
        return listTitle.size();
    }

    public void onCardClick(String listItems) {
        Log.i("SADASSDASDAS", listItems);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,以下代码不起作用:

public void onCardClick(String listItems) {
    Log.i("SADASSDASDAS", listItems);
}
Run Code Online (Sandbox Code Playgroud)

Moh*_*ali 6

RecyclerViewAndroid适配器中的数据绑定

public class DashboardPopularAdapter extends RecyclerView.Adapter<DashboardPopularAdapter.MyViewHolder> {
    private Context mContext;
    private List<PopularProduct> mPopularProductInfos;

    public DashboardPopularAdapter(Context context, List<PopularProduct> popularProductInfos) {
        mContext = context;
        mPopularProductInfos = popularProductInfos;
    }

    @Override
    public DashboardPopularAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int type) {
        ViewDashboardProductsBinding viewProductCategoryBinding = ViewDashboardProductsBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new MyViewHolder(viewProductCategoryBinding);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        final PopularProduct popularProductInfo = mPopularProductInfos.get(position);

        holder.binding.txtProductName.setText(popularProductInfo.getProductName());

        Picasso.with(mContext).load(popularProductInfo.getProductPhoto())
                .error(R.drawable.icon_pills)
                .into(holder.binding.imgProduct);

        holder.binding.llProduct.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mContext.startActivity(new Intent(mContext, ProductDetailsActivity.class)
                        .putExtra("medicine_id", popularProductInfo.getProductId())
                        .putExtra("medicine_name", popularProductInfo.getProductName()));
            }
        });

        
    @Override
    public int getItemCount() {
        return mPopularProductInfos.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        private final ViewDashboardProductsBinding binding;

        public MyViewHolder(ViewDashboardProductsBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Uli*_*Uli 1

您的主要问题是您错过了对 的呼叫binding.setClickListener()。还有其他一些问题。这是一个应该让您走上正轨的示例,忽略您不需要的部分:What is the suggest way to launch a DialogFragment from a ViewModel?