RecyclerViewでのチェックボックスの選択が無秩序です

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コントロールの値への影響を回避し、値はクリックされたときにのみ切り替えられます。

 

 

おすすめ

転載: blog.csdn.net/beita08/article/details/110080610