シングル ボタン クリックでカスタム ListViewからすべてのCheckBoxを選択したい。
しかし、ListView に 9 つ以上のアイテムがある場合、コードの 2 行目以下で NullPointerException が発生します。
View vi= diffeneceLv.getChildAt(i);
CheckBox cb = (CheckBox) vi.findViewById(R.id.conschkbx);
シングル ボタン クリックでカスタム ListViewからすべてのCheckBoxを選択したい。
しかし、ListView に 9 つ以上のアイテムがある場合、コードの 2 行目以下で NullPointerException が発生します。
View vi= diffeneceLv.getChildAt(i);
CheckBox cb = (CheckBox) vi.findViewById(R.id.conschkbx);
行を再利用しますListView
。これは、メモリ内に作成された行/レイアウトの数が配列内のアイテムと等しくないことを意味します。
通常ListView
、スクロール時に新しいデータを前の行にリセットします。
このブログ投稿を検討することをお勧めします。ここでは、作成者が Checked 状態を維持し、それに応じてgetView()
アダプターに設定しています。
著者は、次のようなブール値の配列を作成しました。
private boolean[] thumbnailsselection;
チェックまたはチェック解除の状態を保存し、後で からアクセスすると、すべてのインデックスgetView()
を保存してアダプターを更新します。true
すべての行が選択されます。
ここに別の投稿があります。
個々のビューは再利用されるため、この目的のために参照を保持しないでください。
あなたの便宜のために、チェックされたアイテムを保存ListView
するために を保持します。BooleanSparseArray
この配列には、アイテム ID (アダプタ内のアイテムのインデックス/位置) からブール値へのマップが含まれています。
ListView
がすべてのことを行うので、車輪の再発明を避けListView
、アイテムのチェック状態を保持する の機能を使用することをお勧めします。の選択モードを設定するだけですListView
。setChoiceMode(int choiceMode)
アイテムの状態を取得するには、isItemChecked(int position)
onを呼び出しますListView
。getView()
アダプターをオーバーライドする場合に便利です。
チェックしたものをすべて取得するには、 を呼び出しgetCheckedItemPositions()
ますListView
。
チェックされた値を設定するには、setItemChecked(int position, boolean value)
onを呼び出しますListView
。