退出选择模式后,ListView选择保持不变

CjS*_*CjS 41 java android android-listview

我有一个ListView子类,我允许在上下文操作栏(CAB)处于活动状态时进行选择.CAB被设置为onItemLongClick事件的回调:

public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    // Inflate a menu resource providing context menu items
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(context_menu, menu);
    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这很好,ListView按预期工作,当前选定的项目在触摸时保持突出显示.

当我关闭CAB时,我希望ListView恢复正常(即触摸模式).问题是最后选择的项目会无限期地突出显示,无论我尝试清除它的方法是什么:

public void onDestroyActionMode(ActionMode mode) {
    //Unselect any rows
    ListView lv = getListView();
    lv.clearChoices(); // Has no effect
    lv.setChoiceMode(ListView.CHOICE_MODE_NONE); // Has no effect on the highlighted item 
    lv.setFocusable(false); // Has no effect
    lv.setSelection(0); // Has no effect
    mActionMode = null;
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Rud*_*udi 34

问题的主要原因是一旦ListView切换到选择模式CHOICE_MODE_NONE,框架就会优化清除操作,因为它不再支持"选择".我通过手动清除选择状态然后以延迟方式设置模式来改进上述变通方法,以便框架在转向模式之前轮流清除状态CHOICE_MODE_NONE.

final ListView lv = getListView();
lv.clearChoices();
for (int i = 0; i < lv.getCount(); i++)
    lv.setItemChecked(i, false);
lv.post(new Runnable() {
    @Override
    public void run() {
        lv.setChoiceMode(ListView.CHOICE_MODE_NONE);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 实际上,我没有看到这里需要`lv.clearChoices()`,代码在没有它的情况下也适合我. (2认同)

Kni*_*edi 20

我遇到了同样的问题,因为请求布局并没有解决我的问题,要么我实现了一个对我有用的小黑客.也许这是同一个问题因为我在CHOICE_MODE_SINGLE和之间切换CHOICE_MODE_NONE.

当动作模式结束时,我正在调用此代码段.clearChoices确保不再检查所有项目(内部).对视图的迭代可确保重置所有当前可见的视图,并且不再进行检查.

mListView.clearChoices();

for (int i = 0; i < mListView.getChildCount(); i++) {
    ((Checkable) mListView.getChildAt(i)).setChecked(false);
}

mListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
Run Code Online (Sandbox Code Playgroud)

  • 因为我的ListItems是RelativeLayouts,所以我无法使用它.有什么建议? (3认同)

小智 18

查看ListView源代码,解决此问题的唯一方法是将ListView设置为CHOICE_MODE_NONE,然后重新分配ListAdapter(无论选择模式如何,它都会清除内部选择列表)

即在ListFragment/ListActivity中

getListView().setChoiceMode(ListView.CHOICE_MODE_NONE);
getListView().setAdapter(getListAdapter())
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!重新设置适配器可以解决问题,我怀疑它也兼容所有API版本...... (3认同)