繁体   English   中英

如何在 RecyclerView 中更改所选项目的背景颜色

[英]How to change the background color of selected item in RecyclerView

我创建了一个 Kotlin 移动应用程序。 在我的应用程序中,我使用带有适配器的RecyclerView 我想更改在我的RecyclerView单击的项目的背景颜色,当我单击另一个项目时,颜色将更改并且单击的第一个项目的颜色返回默认颜色。

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
       val itemCategory: ProductCategoryData = categories[position] 
       holder.categoryId.text = itemCategory.id.toString() 

       println(holder.categoryId.text) 
       println(itemCategory.name?.get("En").toString()) 
       holder.categoryName.text = itemCategory.name?.get("En").toString() 
      ............ 
       holder.itemView.setOnClickListener { 
           rowindex = position 
           mListener?.onItemClick(holder.itemView, categories[position]) 
       } 
       if (rowindex == position) { 
           holder.itemView.setBackgroundColor(Color.parseColor("#FED07A")) 
       } else { 
           holder.itemView.setBackgroundColor(Color.parseColor("#ffffff")) 
       } 

   }

我应该更改我的代码以使其正常运行

要更改 RecyclerView 中单击项目的背景,您需要使用 iterface 捕捉适配器中的单击:

interface ItemClickListener {
    fun onItemClickListener(item: Item, position: Int)
}

当我们点击时,我们将获得项目和项目位置。 在适配器中的绑定函数中,我们将设置点击监听器:

container.setOnClickListener {
    onClickListener.onItemClickListener(item, position)
}

在您的活动中,您将实现此接口:

class MainActivity : AppCompatActivity(), ItemAdapter.ItemClickListener {

接下来我们需要实现项目点击的背景变化逻辑。 逻辑是这样的:当用户点击一个项目时,我们检查被点击项目的背景是否为白色(该项目之前没有被点击),如果这个条件为真,我们将改变该项目中所有项目的背景RecyclerView 为白色(如果有的话,使之前点击和标记的项目无效),然后将点击项目的背景颜色更改为青色以标记它。 如果被点击的项目的背景是蓝绿色(这意味着用户再次点击之前标记的同一个项目),我们将所有项目的背景颜色更改为白色。 首先,我们需要将我们的项目背景颜色作为 ColorDrawable。 我们将使用迭代器函数遍历 RecyclerView 的所有项(子项),并使用 forEach() 函数更改每个项的背景。 此方法将如下所示:

 override fun onItemClickListener(item: Item, position: Int) {
        val itemBackground: ColorDrawable =
            binding.recycler[position].background as ColorDrawable
        if (itemBackground.color == ContextCompat.getColor(this, R.color.white)) {
            binding.recycler.children.iterator().forEach { item ->
                item.setBackgroundColor(
                    ContextCompat.getColor(
                        this,
                        R.color.white
                    )
                )
            }
            binding.recycler[position].setBackgroundColor(
                ContextCompat.getColor(this, R.color.teal_200)
            )
        } else {
            binding.recycler.children.iterator().forEach { item ->
                item.setBackgroundColor(
                    ContextCompat.getColor(
                        this,
                        R.color.white
                    )
                )
            }
        }
    }

所以现在你改变了项目点击的背景,如果你点击同一个项目,你将把背景改回以前的背景。

调用 notifyDataSetChanged

holder.itemView.setOnClickListener { 
   rowindex = position 
   mListener?.onItemClick(holder.itemView, categories[position])
   notifyDataSetChanged()          
} 

if (rowindex == position) {            
    holder.itemView.setBackgroundColor(Color.parseColor("#FED07A")) 
} else { 
    holder.itemView.setBackgroundColor(Color.parseColor("#ffffff")) 
}  

此类问题的大部分答案,都是关于在 onBindViewHolder 中覆盖 Onclick 或实现用于在回收器视图中单击的接口。 但众所周知,在滚动期间填充视图时会调用 onBindViewHolder。 因此,您将对 setOnClickListener 进行多次调用,因此它不是一种有效的方法,而且实现接口也不像我得到的答案那么容易。

以下是如何在回收站视图中访问选择项目并更改其背景或在选择项目时执行任何您想要的操作。

在您的 ViewHolder 构造函数中,以这种方式将 setOnTouchListener 用于 itemView(构造函数的参数)。

    itemView.setOnTouchListener((v, event) -> {

                if (event.getAction() == MotionEvent.ACTION_UP) {

                    if (v.getTag() == null) {
                        v.setTag(true);
                        v.setBackgroundColor(Color.parseColor("#F31807"));
                    } else {
                        v.setBackgroundColor(Color.TRANSPARENT);
                        v.setTag(null);
                    }
                }

                if (event.getAction() == MotionEvent.ACTION_MOVE) {
                   //default color
                    v.setBackgroundColor(Color.TRANSPARENT);
                }
                return true;
            });

我们使用 ACTION_UP 来检查用户是否按下了该项目,然后我们在视图的标志中保存了一个布尔值,以便我们可以按我们想要的次数按下每个项目并查看颜色是否发生变化。 ACTION_MOVE if block 是为了防止在滚动回收器视图时选择项目。 如果您看到选择一个项目会影响另一个项目的选择,您可以使用以下答案:

问题:滚动时 RecyclerView 弄乱了数据

最后,如果您对我们为什么在方法中返回 true 感到好奇,请观看此视频以了解。

OnTouchListener 和 Motionevent 教程

暂无
暂无

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

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