1

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 を呼び出すと、問題なく動作します。

4

2 に答える 2

5

同じ問題が発生します。Android のバグであるという回答を持つ関連する質問が既にあるようです。

これは回答ではなくコメントであるべきだと思います。しかし、ここでコメントするには十分な評判がありません。

于 2012-11-06T17:32:11.793 に答える
1

これをまだ解決したかどうかわからないので、この回答は遅すぎるかもしれません。

選択モードを none に戻す前にclearChoices()を使用してみてください(そして、メソッドを呼び出してチェックをクリアすると)、希望どおりに機能すると思います。

private void toggleSelectionMode() { 
    if (listView.getChoiceMode() == ListView.CHOICE_MODE_NONE) { 
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    } 
    else { 
        listview.clearChoices();
        listView.setChoiceMode(ListView.CHOICE_MODE_NONE); 
    }        
    changeItemSelection(SELECT_NONE); 
} 
于 2012-08-12T16:09:06.323 に答える