RecyclerView .addTextChangedListener дает несколько позиций - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать RecyclerView, который содержит EditText в каждой строке. Как только текст будет изменен, я бы хотел показать позицию с помощью println. Он работает нормально, пока я не запустите .notifyDataSetChanged () в моем основном методе. После этого он печатает несколько позиций, даже если был изменен только один EditText.

@Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        holder.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(position);
            }
        });
}

до: et0 изменено = I / System.out: 0 <- правильно </p>

после: et0 изменено = I / System.out: 2 И I / System.out: 0 <- неправильно </p>

1 Ответ

0 голосов
/ 17 января 2019

Это происходит потому, что вы добавляете новый 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);
}

Просто не стесняйтесь спрашивать, если что-то неясно.

...