单击 Android 时,RecyclerView 正在选择多个项目

RecyclerView is Selecting more than one item when click in Android

我正在使用 RecyclerView,问题是当点击一个项目时它变成 selected.after 当点击第二个项目时,第一个和第二个项目同时被选中。 点击代码:

init {
    itemView.setOnClickListener {
        modesList[adapterPosition].isSelected = true
        val modelWrapper = modesList[adapterPosition]
        val formatModel = modelWrapper.mode
        itemListener.recyclerViewListClicked(
            formatModel,
            formatModel.getId(),
            formatModel.modeName,
            formatModel.modeName_Number,
            formatModel.modeBrightnessProgressBar,
            formatModel.modeSpeedProgressBar,
            formatModel.colorValues,
            adapterPosition
        )
    }

您必须在 Recycler Adapter 中声明 itemid 和 itemviewtype 才能解决这个问题。

 @Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}

您应该在适配器中获取项目的位置并将其传递给 activity 或片段,然后简单地完成您的工作。

在这里你可以看到一个例子。


class  MyAdapter : RecyclerView.Adapter<MyAdapter.MyAdapterViewHolder>() {

    inner class MyAdapterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    private val differCallback = object : DiffUtil.ItemCallback<Item>() {
        override fun areItemsTheSame(oldItem: YourEntityObject, newItem: YourEntityObject): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: YourEntityObject, newItem: YourEntityObject): Boolean {
            return oldItem == newItem
        }
    }

    val differ = AsyncListDiffer(this, differCallback)

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

    override fun getItemCount(): Int {
        return differ.currentList.size
    }

    private var onItemClickListener: ((YourEntityObject) -> Unit)? = null

    override fun onBindViewHolder(holder: MyAdapterViewHolder, position: Int) {
        val info = differ.currentList[position]
        holder.itemView.apply {
            
            setOnClickListener {
                onItemClickListener?.let { it(repoInfo) }
            }
        }
    }

    fun setOnItemClickListener(listener: (YourEntityObject) -> Unit) {
        onItemClickListener = listener
    }
}


  • 现在在你的片段中只需简单地写如下。

 private lateinit var myAdapter: MyAdapter 

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)    
        setupRecyclerView()    
        adapterOperation()
    }


  private fun adapterOperation() {
        with(myAdapter) {
          
            setOnItemClickListener {
                toast(it.your_entity_property)// for example toast the name of list item
            }
            
        }
    }


 private fun setupRecyclerView() {
       adapter = MyAdapter()
        your_recyclerveiw.apply {     
            adapter = myAdapter
            layoutManager = LinearLayoutManager(activity)
        }
    }


}