简体   繁体   English

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

[英]RecyclerView is Selecting more than one item when click in Android

I am working with RecyclerView and the issue is when is click on one item it become selected.after That when click on second item the first and second item both are selected at the same time.我正在使用 RecyclerView,问题是当单击一个项目时,它会被选中。之后,当单击第二个项目时,第一个和第二个项目都被同时选中。 Code For Onclick: Onclick 的代码:

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

You have to declare itemid and itemviewtype in your Recycler Adapter to overcome this.您必须在 Recycler Adapter 中声明 itemid 和 itemviewtype 来克服这个问题。

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

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

You should get the position of an item in your adapter and pass it to the activity or fragment and simply do your job.您应该在适配器中获取项目的 position 并将其传递给活动或片段,然后简单地完成您的工作。

Here you can see an example.在这里你可以看到一个例子。


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


  • Now in your fragment just simply write as following.现在在您的片段中只需简单地编写如下。

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


}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM