【问题标题】:RecyclerView is Selecting more than one item when click in Android在Android中单击时RecyclerView正在选择多个项目
【发布时间】:2021-02-23 16:50:35
【问题描述】:

我正在使用 RecyclerView,问题是当单击一个项目时它被选中。之后,当单击第二个项目时,第一个和第二个项目同时被选中。 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
        )
    }

【问题讨论】:

    标签: android android-recyclerview selection


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      你必须在你的 Recycler Adapter 中声明 itemid 和 itemviewtype 来克服这个问题。

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

      【讨论】:

      • 你能解释一下这样做的原因吗?谢谢你
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2021-12-28
      • 2015-07-21
      • 1970-01-01
      相关资源
      最近更新 更多