alekseyHunter
@alekseyHunter
Android developer

Как удалить Listener в RecyclerView?

Недавно читал статьи об утечках памяти и нашел одну у себя, а именно сохранение слушателя после удаления фрагмента.
Для слушателей внутри фрагмента все просто, а вот как удалить Listener в RecyclerView?
Пробовал переопределять метод onViewDetachedFromWindow, но он удаляет слушатели у элементов, которые вышли за пределы экрана.

class RecAdapterObj(var items: ArrayList<Item>) : RecyclerView.Adapter<RecHolderObj>() {

    interface OnListFragmentListener {
        fun onClickListFragment(item: Item)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecHolderObj {
        val inflater = LayoutInflater.from(parent.context)
        val view = inflater.inflate(R.layout.item_obj, parent, false)

        return RecHolderObj(view)
    }

    override fun onBindViewHolder(holder: RecHolderObj, position: Int) {
        holder.bind(items[position])

        holder.itemView.setOnClickListener {
            val mListener: OnListFragmentListener
            try {
                mListener = (it?.context as OnListFragmentListener)
            } catch (e: ClassCastException) {
                throw ClassCastException(it?.context!!.toString() + " must implement onClickListFragment")
            }
            mListener.onClickListFragment(items[position])
        }
    }

    override fun onViewDetachedFromWindow(holder: RecHolderObj) {
        super.onViewDetachedFromWindow(holder)

        holder.itemView.setOnClickListener(null)
}

    override fun getItemCount(): Int {
        return items.size
    }
}
  • Вопрос задан
  • 236 просмотров
Решения вопроса 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Есть смысл ставить один раз обработчик кликов на весь RecyclerView:
https://medium.com/@harivigneshjayapalan/android-r...

Ставить обработчики на каждый элемент списка — это перебор.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы