Срабатывает TextChanged при прокрутке RecycleView

Есть RecycleView. Item'ом является CardView с EditText. В адаптере на EditText повешен addTextChangedListener(). Но он срабатывает всякий раз, когда я нажимаю вне RecycleView или листаю его. С чем это может быть связано и как можно пофиксить? Спасибо)

<androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            app:cardBackgroundColor="#373737"
            app:cardCornerRadius="12dp"
            app:cardElevation="7dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            <TextView
                android:id="@+id/textViewHabit"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="16dp"
                android:clickable="true"
                android:focusableInTouchMode="true"
                android:imeOptions="actionGo"
                android:inputType="textMultiLine"
                android:singleLine="true"
                android:text="@string/EnterHabit"
                android:textAlignment="center"
                android:textColor="@color/colorAccent"
                android:textSize="18sp"
                android:textStyle="bold"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                tools:ignore="KeyboardInaccessibleWidget,TextViewEdits" />
</androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.cardview.widget.CardView>

Это в адаптере:

holder.habit.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}

        override fun afterTextChanged(p0: Editable?) {
            println("Срабатывает не тогда, когда нужно:(")
        }
    })

Ответы (1 шт):

Автор решения: Sergei Buvaka

RecycleView реализовует паттерн ViewHolder.

Что это за паттерн? Этот паттерн отвечает за быструю отрисовку UI, для этого единовременно на экране загружено количество элементов равное количеству которое помещается на экране +1. Таким образом у вас есть некое количество ViewHolder-ов которые по мере скрола RecyclerView заново биндятся.

Не совсем уверен как в точности работает onTextChanged(), но я думаю, что при каждом бинде система вызывает этот колбек.

Как это пофиксить? Возможно стоит в как-то от него отписываться (но точно не подскажу как). Может быть вам стоит попробовать все же сам слушатель передавать снаружи из View, но это тоже не гарантия того, что будет работать.

→ Ссылка