【问题标题】:Listener of a RecyclerView being apply to others RecyclersViewRecyclerView 的监听器被应用到其他 RecyclersView
【发布时间】:2019-06-06 18:32:01
【问题描述】:

好吧,我现在正在与 Kotling 合作,我在 ViewHolderAdapter 内的 onBindViewHolder 中有一个侦听器,但是,这个侦听器的行为将应用于每 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 中的图像内设置侦听器的示例?

【问题讨论】:

  • RecyclerView 在您滚动时回收视图。将选定的索引存储在变量中并在onBindViewHolder 期间检查它。

标签: android kotlin android-recyclerview onclicklistener event-listener


【解决方案1】:

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

【讨论】:

  • 感谢您的回答!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多