onBindViewHolder中如下代码
holder.checkBox.setChecked(model.IsCheck);
//CheckBox事件监听
holder.checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> model.IsCheck = isChecked);
混乱を招きます。ブロガーの記事をたくさん見ていると、その点について話している気がしません。
このモデルはメソッドによって返された位置で取得されますが、アイテムはスライド時に再利用されるため、位置の値は正確ではなくなり、使用する必要があります。
holder.getAdapterPosition()去获取最新的position。
次のログ:
onCheckedChanged: adapterPosition = 6
onCheckedChanged: Position = 0
onCheckedChanged: isChecked = false
第6条にスライドすると、エントリは第0条で再利用されますが、第6条の状態は誤りです。元の位置がまだ使用されている場合、第0条の状態は混乱します。
解決:
1.holder.getAdapterPosition()を使用してモデル値を取得します
holder.checkBox.setChecked(model.IsCheck);
//CheckBox事件监听
holder.checkBox.setOnCheckedChangeListener((buttonView, isChecked)
-> mList.get(holder.getAdapterPosition()).IsCheck = isChecked);
2.代わりに、setOnClickListenerを使用してモニターを設定し、クリックした後に状態を再度設定します。
holder.checkBox.setChecked(model.IsCheck);
//CheckBox事件监听
holder.checkBox.setOnClickListener(v -> model.IsCheck = !model.IsCheck);
比較すると、最初の方法はRecyclerViewとCheckBoxの特性を正しく使用し、2番目の方法はCheckBoxコントロールの値への影響を回避し、値はクリックされたときにのみ切り替えられます。