ListView の項目の選択肢 (選択) をクリアしようとしているときに、奇妙な動作に直面しています。コードはかなりうまく機能し、(CHOICE_MODE_MULTIPLE で一度)タップして単一のアイテムを選択し、すべてを選択し、何も選択せず、現在の選択を反転させる機能を備えています。ListView は両方のモード (_NONE と _MULTIPLE) で動作するはずなので、これらのモードを切り替えるこのメニュー項目を使用して、ユーザーが項目を「開く」か、バッチ操作のために一度に複数の項目を選択できるようにします。
私が直面している問題は、選択モードを CHOICE_MODE_MULTIPLE から CHOICE_MODE_NONE に戻すときにのみ表示されます。私がやろうとしているのは、CHOICE_MODE_NONE に戻すだけでなく、選択肢をすべてクリアすることです。奇妙なことに、すべての関数は確実に機能しますが、CHOICE_MODE_NONE に戻す直前に「非選択」関数を呼び出すと、コード内で「非選択」関数をいつどこで呼び出しても、すべての項目がチェックされたままになります。
選択の変更を処理する関数は次のとおりです。
private void changeItemSelection(int selection) {
NotesAdapter adapter = (NotesAdapter)listView.getAdapter();
if (selection == SELECT_ALL) {
for(int iCount = 0; iCount < adapter.getCount(); iCount++) {
listView.setItemChecked(iCount, true);
}
}
else if (selection == SELECT_NONE) {
for(int iCount = 0; iCount < adapter.getCount(); iCount++) {
listView.setItemChecked(iCount, false);
}
}
else if (selection == SELECT_INVERT) {
for(int iCount = 0; iCount < adapter.getCount(); iCount++) {
listView.setItemChecked(iCount, !listView.isItemChecked(iCount));
}
}
adapter.notifyDataSetChanged();
checkedItemCountInvalid = true; // Invalidate checked indices cache
}
選択モードを切り替えるメニュー項目をユーザーがタップすると、次のようになります。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_multisel:
toggleSelectionMode();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void toggleSelectionMode() {
if (listView.getChoiceMode() == ListView.CHOICE_MODE_NONE) {
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
else {
listView.setChoiceMode(ListView.CHOICE_MODE_NONE);
}
changeItemSelection(SELECT_NONE);
}
上記のコード ブロックのどこに「changeItemSelection(SELECT_NONE)」を配置しても、機能しません。しかし、「listView.setChoiceMode(ListView.CHOICE_MODE_NONE)」を削除すると、魔法のように期待どおりに動作し始めます。それは私を夢中にさせています...これについての洞察を本当に感謝します。
読んでくれてありがとう!
編集:「機能しない」とは、選択が変更されないことを意味します。したがって、 item1 と item3 が選択されている場合、 select none を呼び出してもチェックは解除されませんが、上記のコードの一部で関数を呼び出した場合のみです。選択モードを変更しようとせずに select none を呼び出すと、問題なく動作します。