Recycler View所选项目的颜色未正确更改

问题描述 投票:0回答:2

我陷入了这个问题。我的问题是,我实现了“回收站”视图项目单击的颜色更改。但是,当我选择第一个项目时,只有那个被选中,并且很好。但是当选择第二项时,选择了第一项和第二项。当我选择第五项时,选择1,2和5th。我希望仅单击选中的行项目,而不选择其他项。请帮助。

我的代码(使用Kotlin和MVVM)在这里,

class ItemAdapter() : RecyclerView.Adapter<ItemAdapter.DateViewHolder>() {

    private var ItemList: MutableList<ItemModel>? = ArrayList()
    private lateinit var ItemViewModel: ItemListBinding
    private lateinit var listener: OnItemClickListener

    init {
        this.ItemList = arrayListOf()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DateViewHolder {
        ItemViewModel = DataBindingUtil.inflate(
            LayoutInflater.from(parent.context), R.layout.item_list,
            parent, false
        )
        return DateViewHolder(ItemViewModel)
    }

    override fun onBindViewHolder(holder: DateViewHolder, position: Int) {
        holder.bindItemDetail(ItemList!![position])
    }

    override fun getItemCount(): Int {
        return ItemList!!.size
    }

    fun setItemList(List: MutableList<ItemModel>) {
        this.ItemList = List
        notifyDataSetChanged()
    }

    fun setListener(listener: OnItemClickListener) {
        this.listener = listener
    }

    fun removeAt(selectedPos: Int) {
        ItemList?.removeAt(selectedPos)
        notifyItemRemoved(selectedPos)
    }


    inner class DateViewHolder(private var itemDetailBinding: ItemListBinding) :
        RecyclerView.ViewHolder(itemDetailBinding.root) {

        fun bindItemDetail(ItemResponse: ItemModel) {

            if (itemDetailBinding.ItemDetailModel == null) {
                itemDetailBinding.ItemDetailModel =
                    ItemDetailViewModel(ItemResponse, itemView.context)
            } else {
                itemDetailBinding.ItemDetailModel!!.setDetail(ItemResponse)
                itemDetailBinding.executePendingBindings()
            }

            itemDetailBinding.root.Detail.setOnClickListener {
                if(position == adapterPosition) {
                    itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT_BOLD)
                    itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorGreyLight)
                    itemView.isSelected = false
                } else {
                    itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT)
                    itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorWhite)
                    itemView.isSelected = true
                }
                notifyDataSetChanged()
            }

        }
    }
}

xml在这里

  <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/Detail"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_marginTop="2dp"
            android:layout_marginBottom="2dp"
            android:background="@color/colorWhite">

            <TextView
                android:id="@+id/itemDescp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="5dp"
                android:layout_marginTop="1dp"
                android:layout_marginEnd="60dp"
                android:ellipsize="end"
                android:maxLines="1"
                android:text="@{ItemDetailModel.description}"
                android:textAlignment="textStart"
                app:layout_constraintRight_toLeftOf="@+id/qtyValue"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <EditText
                android:id="@+id/qtyValue"
                android:layout_width="40dp"
                android:layout_height="25dp"
                android:layout_marginRight="3dp"
                android:background="@drawable/edit_shape"
                android:maxLines="1"
                android:paddingLeft="5dp"
                android:paddingTop="3dp"
                android:paddingRight="7dp"
                android:paddingBottom="3dp"
                android:text="@{ItemDetailModel.quantity}"
                android:textAlignment="textEnd"
                android:textSize="16sp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>

任何帮助将不胜感激。谢谢

android kotlin android-recyclerview android-databinding android-mvvm
2个回答
0
投票

添加

private var selectedItemPosition = -1

然后

inner class DateViewHolder(private var itemDetailBinding: ItemListBinding) :
    RecyclerView.ViewHolder(itemDetailBinding.root) {

    fun bindItemDetail(ItemResponse: ItemModel) {

        if (itemDetailBinding.ItemDetailModel == null) {
            itemDetailBinding.ItemDetailModel =
                ItemDetailViewModel(ItemResponse, itemView.context)
        } else {
            itemDetailBinding.ItemDetailModel!!.setDetail(ItemResponse)
            itemDetailBinding.executePendingBindings()
        }
        if(position == selectedItemPosition) {
            itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT_BOLD)
            itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorGreyLight)
            itemView.isSelected = true
        } else {
            itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT)
            itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorWhite)
            itemView.isSelected = false
        }

        itemDetailBinding.root.Detail.setOnClickListener {
            selectedItemPosition = position
            notifyDataSetChanged()
        }

    }

0
投票

您在此登录中遇到问题。

itemDetailBinding.root.Detail.setOnClickListener {
                if(position == adapterPosition) {
                    itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT_BOLD)
                    itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorGreyLight)
                    itemView.isSelected = false
                } else {
                    itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT)
                    itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorWhite)
                    itemView.isSelected = true //**you are selecting but not deselecting previous one. please check this.**
                }
                notifyDataSetChanged()
            }




class ItemAdapter() : RecyclerView.Adapter<ItemAdapter.DateViewHolder>() {

    private var ItemList: MutableList<ItemModel>? = ArrayList()
    private lateinit var ItemViewModel: ItemListBinding
    private lateinit var listener: OnItemClickListener

    init {
        this.ItemList = arrayListOf()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DateViewHolder {
        ItemViewModel = DataBindingUtil.inflate(
            LayoutInflater.from(parent.context), R.layout.item_list,
            parent, false
        )
        return DateViewHolder(ItemViewModel)
    }

    override fun onBindViewHolder(holder: DateViewHolder, position: Int) {
        holder.bindItemDetail(ItemList!![position])
    }

    override fun getItemCount(): Int {
        return ItemList!!.size
    }

    fun setItemList(List: MutableList<ItemModel>) {
        this.ItemList = List
        notifyDataSetChanged()
    }

    fun setListener(listener: OnItemClickListener) {
        this.listener = listener
    }

    fun removeAt(selectedPos: Int) {
        ItemList?.removeAt(selectedPos)
        notifyItemRemoved(selectedPos)
    }


    inner class DateViewHolder(private var itemDetailBinding: ItemListBinding) :
        RecyclerView.ViewHolder(itemDetailBinding.root) {

        fun bindItemDetail(ItemResponse: ItemModel) {

            if (itemDetailBinding.ItemDetailModel == null) {
                itemDetailBinding.ItemDetailModel =
                    ItemDetailViewModel(ItemResponse, itemView.context)
            } else {
                itemDetailBinding.ItemDetailModel!!.setDetail(ItemResponse)
                itemDetailBinding.executePendingBindings()
            }

            if(itemView.isSelected) {
                    itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT_BOLD)
                    itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorGreyLight)
                } else {
                    itemDetailBinding.root.itemDescp.setTypeface(Typeface.DEFAULT)
                    itemDetailBinding.root.Detail.setBackgroundResource(R.color.colorWhite)
            }

            itemDetailBinding.root.Detail.setOnClickListener {
                toggleSelection(adapterPosition)
            }

        }
    }

    private fun toggleSelection(adapterPosition: Int) {
        for ((index, value) in ItemList.withIndex()) {
            value.isSelected = index == adapterPosition
        }
        notifyDataSetChanged()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.