首页 > 解决方案 > RecyclerView 的监听器被应用到其他 RecyclersView

问题描述

好吧,我现在正在与 Kotling 一起工作,并且我在onBindViewHolder里面有一个监听ViewHolderAdapter器,但是,这个监听器的行为被应用于每 10 个位置。当我触摸该图像时,该行为只是使用滤色器更改图像颜色。很简单。

我尝试过使用holder.setIsRecyclable(false),但是当回收器离开屏幕时,图像变为正常设计,而不是更红。

这是我的ViewHolderAdapter


class ViewHolderAdapter(private var products:List<EachProduct>):RecyclerView.Adapter<ViewHolderAdapter.ViewHolder>(){

    override fun onCreateViewHolder(parent:ViewGroup,viewType:Int):ViewHolder{
        val view=LayoutInflater.from(parent.context).inflate(R.layout.recyclerview_layout,parent,false)
        return ViewHolder(view)

    }

    override fun getItemCount():Int{

        return products.size

    }

    override fun onBindViewHolder(holder:ViewHolder,position:Int){
        //holder.setIsRecyclable(false)
        holder.likeImage.setOnClickListener{ 
            holder.likeImage.setColorFilter(Color.RED) 
        }   

    }

    class ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){

        var likeImage:ImageView=itemView.LikeImage

    }

}

我预计只有被触摸的 RecyclerView 的图像会发生变化,而不是例如每 10 行发生一次。有人可以为我提供一个关于如何在 RecyclerView 中的图像内设置侦听器的示例吗?

标签: androidkotlinandroid-recyclerviewonclicklistenerevent-listener

解决方案


ImageView.setColorFilter()ColorFilter对象分配给ImageView. 这意味着当您ViewHolder被回收并重新绑定到新图像时,ColorFilter它仍然存在并且将应用于加载的任何图像。

此外,如果您向上和向下滚动,不能保证ViewHolder相同的位置将用于相同的位置。

您需要做的是以某种方式将图像存储在您的数据集中,无论图像是否应该应用过滤器。例如,也许您存储最后点击的位置:

var lastClickedPosition = -1

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    if (position == lastClickedPosition) {
        holder.likeImage.setColorFilter(Color.RED)
    } else {
        holder.likeImage.setColorFilter(null)
    }

    holder.likeImage.setOnClickListener { 
        val previousPosition = lastClickedPosition
        lastClickedPosition = position
        notifyItemChanged(position)

        if (previousPosition != -1) {
            notifyItemChanged(previousPosition)
        }
    } 
}

或者,也许您希望能够一次将过滤器应用于多行。然后也许您可以将一个字段添加到支持您的适配器的任何列表中,或者创建一组可变的突出显示位置:

val clickedPositions = mutableSetOf<Int>()

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    if (clickedPositions.contains(position)) {
        holder.likeImage.setColorFilter(Color.RED)
    } else {
        holder.likeImage.setColorFilter(null)
    }

    holder.likeImage.setOnClickListener {
        clickedPositions.add(position)
        notifyItemChanged(position)
    } 
}

推荐阅读