Раунды посередине в направлении + ∞
int RoundNearest16(int value)
{
return (value + 8) & ~0xF;
}
Вы столкнулись с этой проблемой, потому что RecyclerView
использует шаблон ViewHolder, с помощью которого он повторно использует дочернее представление и сокращает потребление памяти.
вы можете перейти по этой ссылке
или
вы можете выполните следующие простые шаги.
1) Возьмите логическое значение в вашем источнике данных, т.е. список ваших классов данных / модели.
(Это логическое значение будет хранить текущее состояние флажка)
2) В событии onClick
флажок переключает значение этого логического значения для отображаемых данных. Модель и вызов notifyDataSetChanged.
(Не используйте здесь onCheckedChanged
)
3) При рендеринге ставьте условие, отмечать ли флажок как отмеченный или не отмеченный на основе этого логического значения. [1119 ]
У меня возникли проблемы с этим, когда я назначил прослушиватель 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, но концепция должна быть применима к вашей проблеме.
Если вы можете получить position
внутри анонимных реализаций, это означает, что это final
. Как внутри слушателя чекбокса.
A final position
вызовет расхождения между данными и пользовательским интерфейсом, потому что он не будет определяться снова. К этому моменту должен быть отстранен метод onBindViewHolder
, который имеет лучшее объяснение, чем мой.
Для того, чтобы получить доступ к финальной позиции, вы можете использовать:
holder.getAdapterPosition()
Вам не нужно беспокоиться о том, что держатель был конечным, потому что держатель - это строка, и он не будет повторно создаваться. Если он утилизируется адаптером, то с ним проблем нет.