Слушатель RecyclerView, применяемый к другим RecyclersView - PullRequest
0 голосов
/ 06 июня 2019

Ну, я сейчас работаю с Kotling, и у меня есть слушатель в onBindViewHolder внутри ViewHolderAdapter, но поведение этого слушателя применяется в каждых 10 позициях.Поведение заключается в том, чтобы просто изменить цвет изображения, используя цветной фильтр, когда я касаюсь этого изображения.Довольно просто

Я пытался использовать holder.setIsRecyclable(false), но когда Recycler выходит из экрана, изображение приобретает нормальный дизайн, а не более красный.

Вот мой 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?

1 Ответ

0 голосов
/ 06 июня 2019

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)
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...