簡體   English   中英

recyclerView 適配器中的數據綁定 - Android

[英]Data binding in adapter of recyclerView - Android

我在我的項目中使用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>

我在此行中指定了onClick處理程序:

android:onClick="@{()->clickListener.onCardClick(listItems)}"

下面是我的適配器:

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

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

public void onCardClick(String listItems) {
    Log.i("SADASSDASDAS", listItems);
}

RecyclerView適配器中的數據綁定 - Android

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;
        }
    }
}
public class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.ViewHolder> {
    StudentListRowBinding listRowBinding;
    ArrayList<Student> studentlist;

    public StudentAdapter(ArrayList<Student> studentlist) {
        this.studentlist = studentlist;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       
        listRowBinding= DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),R.layout.student_list_row,parent,false);
        return new ViewHolder(listRowBinding.getRoot());
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
            /*listRowBinding.stuname.setText(studentlist.get(position).getName());
            listRowBinding.stumob.setText(studentlist.get(position).getMobile());
            listRowBinding.stucity.setText(studentlist.get(position).getCity());  */

        holder.stuname.setText(studentlist.get(position).getName());
        holder.stumob.setText(studentlist.get(position).getMobile());
        holder.stucity.setText(studentlist.get(position).getCity());


        if (position == getItemCount() - 1)
            holder.divider.setVisibility(View.GONE);
    }

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

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView stuname, stumob, stucity;
        View divider;

        public ViewHolder(View itemView) {
            super(itemView);
            stuname = (TextView) itemView.findViewById(R.id.stuname);
            stumob = (TextView) itemView.findViewById(R.id.stumob);
            stucity = (TextView) itemView.findViewById(R.id.stucity);
            divider = itemView.findViewById(R.id.divider);
        }
    }


}

您的主要問題是您缺少對binding.setClickListener()的調用。 還有其他一些問題。 這是一個應該讓您走上正軌的示例,忽略您不需要的部分: What is the recommended way to launch a DialogFragment from a ViewModel?

Android 只是在您定義android:onClick="someMethod"屬性時為您實現OnClickListener ,因此請嘗試此代碼。

代碼實現

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

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

        v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    onCardClick(listItems)
                }
        });
    }

這是用於數據綁定的適配器類:

class MyBasketAdapter(
        items: List<GetBasketData>,
        private val itemClick: (view: View, position: Int, getBasketData: GetBasketData?) -> Unit)
    : RecyclerView.Adapter<MyBasketAdapter.ViewHolder>() {

// refresh items
var items = items
    set(value) {
        field = value
        notifyDataSetChanged()
    }

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder(
        DataBindingUtil.inflate(
            LayoutInflater.from(parent.context),
            R.layout.item_my_basket,
            parent,
            false
        )
    )
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bind(position)
    holder.itemView.setOnClickListener(holder)
    holder.itemView.ibDelete.setOnClickListener(holder)
}

override fun getItemCount(): Int {
    return items.count()
}

inner class ViewHolder(private val binding: ItemMyBasketBinding) :
    RecyclerView.ViewHolder(binding.root), View.OnClickListener {

    override fun onClick(v: View?) {
        v?.let {
            itemClick.invoke(it, adapterPosition, items[adapterPosition])
        }
    }

    fun bind(
        position: Int
    ) {
        binding.basketData = items[position]
        binding.executePendingBindings()
    }
}

這是我的item_my_basket.xml文件

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>

    <import type="android.view.View" />

    <import type="com.gobaskt.ui.utils.DateTimeUtil" />

    <import type="com.gobaskt.ui.utils.extensions.BindingAdapters" />

    <variable
        name="basketData"
        type="com.gobaskt.ui.bottomnavigation.basket.model.GetBasketData" />

</data>

<com.google.android.material.card.MaterialCardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:cardBackgroundColor="@color/white"
    app:cardCornerRadius="0dp"
    app:cardElevation="0dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/bg_item_dotted_line_blue_2dp">

        <com.google.android.material.radiobutton.MaterialRadioButton
            android:id="@+id/rbSelectItem"
            android:layout_width="@dimen/_10sdp"
            android:layout_height="@dimen/_10sdp"
            android:background="@drawable/my_basket_rb_selector"
            android:button="@color/transparent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/imgProduct"
            android:layout_width="@dimen/_62sdp"
            android:layout_height="@dimen/_62sdp"
            android:layout_marginStart="@dimen/_4sdp"
            android:layout_marginTop="@dimen/_8sdp"
            android:layout_marginBottom="@dimen/_8sdp"
            android:adjustViewBounds="true"
            app:actualImageScaleType="centerInside"
            app:imageUriForFresco="@{basketData.offers.mobileOfferImage1}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toEndOf="@id/rbSelectItem"
            app:layout_constraintTop_toTopOf="parent"
            app:placeholderImage="@drawable/ic_place_holder"
            app:placeholderImageScaleType="centerCrop"
            app:roundAsCircle="true" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/txtProductName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/_8sdp"
            android:layout_marginEnd="@dimen/_4sdp"
            android:ellipsize="end"
            android:fontFamily="@font/montserrat_medium"
            android:maxLines="1"
            android:text="@{basketData.offers.lmName}"
            android:textColor="@color/black"
            android:textSize="@dimen/_13ssp"
            app:layout_constraintBottom_toTopOf="@+id/txtValidOn"
            app:layout_constraintEnd_toStartOf="@+id/txtOffValue"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/imgProduct"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_chainStyle="packed"
            tools:text="Jursey Mike’s Subs" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/txtValidOn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/_8sdp"
            android:layout_marginTop="@dimen/_2sdp"
            android:layout_marginEnd="@dimen/_4sdp"
            android:ellipsize="end"
            android:fontFamily="@font/montserrat_light"
            android:maxLines="1"
            android:text="@{basketData.offers.offerTermsAndConditions}"
            android:textColor="@color/black"
            android:textSize="@dimen/_9ssp"
            app:layout_constraintBottom_toTopOf="@+id/txtValidTill"
            app:layout_constraintEnd_toStartOf="@+id/txtOffValue"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/imgProduct"
            app:layout_constraintTop_toBottomOf="@+id/txtProductName"
            tools:text="Only on Hot subs" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/txtValidTill"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/_8sdp"
            android:layout_marginTop="@dimen/_2sdp"
            android:ellipsize="end"
            android:fontFamily="@font/montserrat_medium"
            android:maxLines="1"
            android:text="@string/valid_till"
            android:textColor="@color/black"
            android:textSize="@dimen/_9ssp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toEndOf="@+id/imgProduct"
            app:layout_constraintTop_toBottomOf="@+id/txtValidOn" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/txtValidTillDate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/_4sdp"
            android:layout_marginEnd="@dimen/_8sdp"
            android:ellipsize="end"
            android:fontFamily="@font/montserrat_medium"
            android:maxLines="1"
            android:text="@{basketData.offers.offerExpiryDate}"
            android:textColor="@color/orange_f87733"
            android:textSize="@dimen/_9ssp"
            app:layout_constraintBottom_toBottomOf="@id/txtValidTill"
            app:layout_constraintEnd_toStartOf="@id/ibDelete"
            app:layout_constraintStart_toEndOf="@+id/txtValidTill"
            app:layout_constraintTop_toTopOf="@id/txtValidTill"
            tools:text="9th Oct" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/txtOffValue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="@dimen/_4sdp"
            android:fontFamily="@font/montserrat_bold"
            android:text="@{basketData.offers.lmOfferValue +``+basketData.offers.lmOfferType}"
            android:textColor="@color/blue_2d3263"
            android:textSize="@dimen/_15ssp"
            app:layout_constraintBottom_toBottomOf="@+id/txtProductName"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/txtProductName"
            app:layout_constraintTop_toTopOf="@+id/txtProductName"
            tools:text="15 %" />

        <androidx.appcompat.widget.AppCompatImageButton
            android:id="@+id/ibDelete"
            android:layout_width="@dimen/_30sdp"
            android:layout_height="@dimen/_30sdp"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:backgroundTint="@color/transparent"
            android:clickable="true"
            android:focusable="true"
            android:src="@drawable/ic_delete_basket_item"
            app:layout_constraintBottom_toBottomOf="@+id/txtValidTillDate"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/txtValidTillDate"
            app:layout_constraintTop_toTopOf="@+id/txtValidTillDate" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</com.google.android.material.card.MaterialCardView>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM