带有复选框的 livedata recyclerview

livedata recyclerview with checkbox

我正在实施 android 架构组件来查看买家列表和 select 一个。

这是我的买家实体

@Entity
data class Buyer(@PrimaryKey var id: Long = 0, var name: String = "", var photo: String = "", var address: String = "",
                 @Ignore var isSelected: Boolean = false,
                 @SerializedName("last_update_time") var lastUpdateTime: Long = 0L) {

}

我已经插入并显示在recyclerview中。

我想知道如何在点击一个买家时显示特定买家selected。

如果我点击一位买家之前 selected 买家必须删除select。

请帮我实现这个。

编辑

class BuyerAdapter(private var buyers: ArrayList<Buyer>, private val listener: View.OnClickListener) : RecyclerView.Adapter<BuyerViewHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BuyerViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(
                R.layout.item_buyer, parent, false)
        return BuyerViewHolder(v)
    }

    override fun onBindViewHolder(holder: BuyerViewHolder, position: Int) {
        bindView(holder, position)
    }

    private fun bindView(holder: BuyerViewHolder, position: Int) {
        val buyer = buyers[position]
        holder.setName(buyer.name)
        holder.setAddress(buyer.address)
        holder.loadImage(ServiceHandler.BASE_URL + buyer.photo)
        if (buyer.isSelected) {
            holder.setCardColor(R.color.waveBlue)
            holder.setNameColor(R.color.white)
            holder.setAddressColor(R.color.white)
        } else {
            holder.setCardColor(R.color.white)
            holder.setNameColor(R.color.contentGrey)
            holder.setAddressColor(R.color.contentGreyDesc)
        }
        holder.itemView.tag = buyer
        holder.itemView.setOnClickListener(listener)
    }

    override fun getItemCount(): Int = buyers.size
    fun refresh(newBuyers: ArrayList<Buyer>) {
        this.buyers = newBuyers
        notifyDataSetChanged()
    }
}

这是我的适配器 xml 项目

<?xml version="1.0" encoding="utf-8"?><!--<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"--><!--xmlns:card_view="http://schemas.android.com/apk/res-auto"--><!--android:layout_width="match_parent"--><!--android:layout_height="191dp"--><!--android:paddingTop="13dp"--><!--&gt;-->

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/buyer_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="4dp"
    android:clickable="true"
    card_view:cardCornerRadius="2dp"
    card_view:cardElevation="4dp"
    card_view:cardPreventCornerOverlap="true">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/rlBuyerBack"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="4dp">
        ​

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/ivLogo"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:scaleType="centerCrop"
            android:src="@drawable/placeholder_profile_photo"
            card_view:layout_constraintBottom_toBottomOf="parent"
            card_view:layout_constraintLeft_toLeftOf="parent"
            card_view:layout_constraintTop_toTopOf="parent" />

        <in.motiontech.wave.helper.WaveTextView
            android:id="@+id/tvName"
            style="@style/semiBoldFont"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:text="Name"
            android:textColor="@color/contentGrey"
            android:textSize="@dimen/tSizeHeader"
            card_view:layout_constraintLeft_toRightOf="@+id/ivLogo"
            card_view:layout_constraintTop_toTopOf="@+id/ivLogo" />


        <in.motiontech.wave.helper.WaveTextView
            android:id="@+id/tvAddress"
            style="@style/regularFont"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@id/tvName"
            android:layout_below="@+id/tvName"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="2dp"
            android:text="Address"
            android:textColor="@color/contentGrey"
            android:textSize="@dimen/tSizeDesc"
            card_view:layout_constraintLeft_toRightOf="@+id/ivLogo"
            card_view:layout_constraintTop_toBottomOf="@+id/tvName" />
    </android.support.constraint.ConstraintLayout>

</android.support.v7.widget.CardView>

编辑 2 这是我如何在 recyclerview

中添加数据
viewModel.getBuyers().observe(this, Observer<List<Buyer>> {
            if (it != null) {
                if (it.isEmpty()) {
                    showProgress()
                    if (CommonUtils.isInNetwork(this)) {
                        viewModel.getBuyerList()
                    } else {
                        CommonUtils.showNoInternetDialog(this)
                    }
                } else {
                    hideProgress()
                    buyerAdapter?.refresh(ArrayList(it))
                }
            }
        })

我所做的是更新了实时数据的值。你可以看到下面的代码:

fun selectBuyer(buyer: Buyer?) {
        if (buyer == null)
            return
        buyers.value?.filter { it != buyer }?.forEach { it.isSelected = false }
        buyers.value?.get(buyers.value!!.indexOf(buyer))?.isSelected = true
        newBuyer = buyer
    }

我注意到不需要通知更新,因为我正在使用观察者模式