与复选框的livingata recyclerview

时间:2017-12-08 12:32:07

标签: android android-recyclerview android-checkbox android-livedata

我正在实现android架构组件来查看买家列表并选择一个。

这是我的买方实体

@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中显示。

我想要知道当点击一位买家时,如何选择特定买家。

如果我点击一位买家,之前选定的买家必须取消选择。

请帮我实现这个。

修改

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

1 个答案:

答案 0 :(得分:0)

What I have done is I have updated value of livedata. You can see below code:

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
    }

I notice there is no need to notifyupdate, as I am using observer pattern