В Android, проверяя флажок в RecyclerView, автоматически проверяет некоторые другие флажки [дубликат]

Раунды посередине в направлении + ∞

int RoundNearest16(int value)
{
    return (value + 8) & ~0xF;
}
-1
задан James Z 18 January 2019 в 15:43
поделиться

3 ответа

Вы столкнулись с этой проблемой, потому что RecyclerView использует шаблон ViewHolder, с помощью которого он повторно использует дочернее представление и сокращает потребление памяти.

вы можете перейти по этой ссылке

или

вы можете выполните следующие простые шаги.

1) Возьмите логическое значение в вашем источнике данных, т.е. список ваших классов данных / модели.
(Это логическое значение будет хранить текущее состояние флажка)

2) В событии onClick флажок переключает значение этого логического значения для отображаемых данных. Модель и вызов notifyDataSetChanged.
(Не используйте здесь onCheckedChanged)

3) При рендеринге ставьте условие, отмечать ли флажок как отмеченный или не отмеченный на основе этого логического значения. [1119 ]

0
ответ дан Nitesh 18 January 2019 в 15:43
поделиться

У меня возникли проблемы с этим, когда я назначил прослушиватель checkedChange в OnBindViewHolder, так что при повторном использовании это будет вызываться несколько раз. для меня работало определение обратного вызова и слушателя в методе создания viewHolder.

public class CheckBoxHolder : RecyclerView.ViewHolder
    {
        public TextView line, destination, twd;
        public ImageView icon;
        public LinearLayout lineParent;
        public CheckBox checkBox;
        public CheckBoxHolder(View view, Action<int, CompoundButton.CheckedChangeEventArgs> listener) : base(view)
        {
            checkBox = view.FindViewById<CheckBox>(Resource.Id.check_checkBox);

            twd = view.FindViewById<TextView>(Resource.Id.check_twd);
            destination = view.FindViewById<TextView>(Resource.Id.check_dest);
            line = view.FindViewById<TextView>(Resource.Id.check_line);
            lineParent = view.FindViewById<LinearLayout>(Resource.Id.check_line_parent);
            icon = view.FindViewById<ImageView>(Resource.Id.check_icon); 
            view.Click += (sender, e) => {
                checkBox.Checked = !checkBox.Checked;
            };
            checkBox.CheckedChange += (object sender, CompoundButton.CheckedChangeEventArgs e) => listener(base.Position, e);
        }
    }

это код C # от xamarin, но концепция должна быть применима к вашей проблеме.

0
ответ дан Joachim Haglund 18 January 2019 в 15:43
поделиться

Если вы можете получить position внутри анонимных реализаций, это означает, что это final. Как внутри слушателя чекбокса.

A final position вызовет расхождения между данными и пользовательским интерфейсом, потому что он не будет определяться снова. К этому моменту должен быть отстранен метод onBindViewHolder, который имеет лучшее объяснение, чем мой.

Для того, чтобы получить доступ к финальной позиции, вы можете использовать:

holder.getAdapterPosition()

Вам не нужно беспокоиться о том, что держатель был конечным, потому что держатель - это строка, и он не будет повторно создаваться. Если он утилизируется адаптером, то с ним проблем нет.

0
ответ дан cutiko 18 January 2019 в 15:43
поделиться
Другие вопросы по тегам:

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