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