Функции onClickListener в OnBindViewHolder дают странные результаты

Я использую RecyclerView.Adapter для отображения нескольких ViewHolder с различными сообщениями. Это функция onBindViewHolder:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
  holder.submitButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        holder.messageTextView.setText("Updated message");
    }
  });
}

Странная вещь, которая происходит, заключается в том, что если я нажму кнопку SubmitButton на 1-ом ViewHolder, тогда сообщение будет отображаться на нем как «Обновленное сообщение», но затем, когда я прокручу вниз до других ViewHolders, пятый ViewHolder содержит «Обновленное сообщение», а также 9-е , 13-й и т. Д. Уже имеют отображаемое на них сообщение. Аналогично, если я нажму кнопку submitButton на втором ViewHolder, сообщение будет отображаться на 2, 6, 10, 14 и так далее.

В идеале, он должен работать, как если бы я нажимал submitButton на 1-ом ViewHolder, сообщение должно отображаться только на 1-ом ViewHolder, а не на других.

Мне пришлось поставить параметр ViewHolder в качестве окончательного, чтобы я мог вызвать его во внутреннем классе функции onClick.

Я понятия не имею, почему это происходит, и я никогда не использовал функции onBindViewHolder раньше, но я чувствую, что это связано с тем, что аргумент держателя ViewHolder является «окончательным» .

java,android,android-studio,android-recyclerview,

0

Ответов: 1


1 принят

Проблема связана с повторным использованием ViewHolder. При прокрутке ячеек вы повторно используете и не создаете новые.

Адаптер создает несколько ячеек, равных видимым ячейкам, и когда прокрутка экрана всегда используется повторно.

Вы должны сохранить его где-нибудь в таких позициях, обновили TextView и добавили в onBindViewHolder чек, чтобы проверить, нужно ли вам установить текст TextView на пустую строку или «Обновленное сообщение» на основе позиции

Java, Android, андроид-студия, андроид-recyclerview,
Похожие вопросы