回收站查看所选项目颜色未正确更改
Recycler View selected item color not changing properly
我陷入了这个问题。我的问题是,我实现了 Recycler 查看项目点击的颜色变化。但是当我 selected 第一项时,只有 selected 并且它很好。但是当 select 第二项时,第一项和第二项得到了 selected。当我 select 编辑了第 5 项时,第 1,2 和第 5 项得到了 select 编辑。我希望单击的行项目只得到 selected 而其他人不。请帮忙。
我的代码(使用 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>
如有任何帮助,我们将不胜感激。谢谢
添加
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()
}
}
我陷入了这个问题。我的问题是,我实现了 Recycler 查看项目点击的颜色变化。但是当我 selected 第一项时,只有 selected 并且它很好。但是当 select 第二项时,第一项和第二项得到了 selected。当我 select 编辑了第 5 项时,第 1,2 和第 5 项得到了 select 编辑。我希望单击的行项目只得到 selected 而其他人不。请帮忙。
我的代码(使用 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>
如有任何帮助,我们将不胜感激。谢谢
添加
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()
}
}