Это происходит потому, что вы добавляете новый TextWatcher каждый раз, когда ваш ViewHolder связан с представлением. RecyclerView правильно перерабатывает ViewHolders, поэтому, когда он использует уже созданный, он просто добавляет новый TextWatcher.
Вы можете изменить способ использования этого, зарегистрировав TextWatcher при создании ViewHolder, чтобы вам не приходилось иметь дело с непрерывными привязками слушателя. Итак, в вашем конструкторе ViewHolder после привязки вашего EditText вы можете добавить TextWatcher, например так:
this.etName = root.findViewById(R.id.yourEtID); // I'm sure you're doing something very similar to this in your VH's constructor
this.etName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
System.out.println(etName.getTag());
}
});
Вы заметите, что на этот раз я использовал etName.getTag (), чтобы прочитать позицию. Это очень полезно, потому что теперь вы можете просто изменить свой onBindViewHolder, чтобы он выглядел так:
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.etName.setTag(position);
}
Просто не стесняйтесь спрашивать, если что-то неясно.