我目前正在使用ListView来展示一些项目。我已经实现了一个操作模式,可以选择多个项目并进行大规模删除,在Android 4.x上运行良好。但是当我尝试使用API版本8或9(Android 2.2.x / 2.3.x)时,选择在内部按预期工作,但行项目的颜色会随机变化。
如果用户选择第一行,内部选择第一行,但第四行被着色。当我点击另一行时,这一行和第一行都被着色。这是一种奇怪的行为,我希望它能像4.x设备上那样正常工作。
长按覆盖以激活操作模式并检查ListView中长按的项目:
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
if (actionMode == null) {
listView.setOnItemClickListener(new CABClickListener());
actionMode = startActionMode(new ListActionMode());
// Check item pressed with long click
listView.setItemChecked(position, true);
view.setBackgroundColor(checkedColor);
logger.debug("Item at pos. " + position + ", checked.");
}
return true;
}
CABClickListener负责检查/取消ListView项目的选择状态,内部标记它们并更改其背景颜色:
private final class CABClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if (listView.isItemChecked(position)) {
view.setBackgroundColor(checkedColor);
logger.debug("Item at pos. " + position + ", checked.");
} else {
view.setBackgroundColor(uncheckedColor);
logger.debug("Item at pos. " + position + ", unchecked.");
}
}
}
这些类/方法位于 Activity 内部,listView 在其顶部声明。
更多注意事项:
- 使用 ActionBarSherlock(它显示了 CAB,但我认为这在这里不重要)和 Roboguice,但我对此没有任何问题。
我一直在使用模拟器进行开发。此外,我无法尝试我的应用程序与 Android 3.x(遇到了问题,模拟器无法启动),因此我不知道问题是否仍然存在于这些版本中。更新:在 Android 3.0 API 11 中测试,与4.x上一样正常工作。- 我调试了代码和两种方法中的
View,但是当我调用view.setBackgroundColor(checkedColor);时,另一个View被着色了。
有什么建议吗?希望有人能帮忙!