我的 ListView
有一个不寻常的问题。我目前有一个“deselectAll()
”方法,它遍历我的 ListView 中的项目并将它们设置为未选中(这些项目实现了 Checkable
接口(interface))。 “checked”变量被正确更改( View 报告未被选中),但视觉指示器(在本例中为背景更改)并未将 View 显示为未选中(背景保持选中项目的颜色)。
我正在通过我的 ListView 进行迭代和取消选择(我还添加了我的 declerations):
private ListView vw_entryList;
private void deselectAll() {
for (int i = 0; i < sAdapter.getCount(); i++) {
((Entry)vw_entryList.getItemAtPosition(i)).setChecked(false);
}
}
我实现的setChecked()
代码如下:
public void setChecked(boolean checked) {
_checked = checked;
if (checked) {
setBackgroundResource(R.drawable.listview_checked);
}
else {
setBackgroundResource(R.drawable.listview_unchecked);
}
invalidate();
}
应该注意的是,当项目被点击时,它们会在 OnItemClickListener
中在选中和未选中之间切换,这工作正常,背景改变和一切。切换的代码非常相似:
public void toggle() {
_checked = !_checked;
setBackgroundResource(_checked ?
R.drawable.listview_checked : R.drawable.listview_unchecked);
invalidate();
}
我能看到的唯一区别是调用方法的位置。 toggle()
是从 OnItemClickListener.onClick()
方法中调用的,而我的 deselectAll()
是从按钮的标准 中调用的>OnClickListener
,两者在同一个类中。 有人知道为什么在我调用 deselectAll() 函数时背景没有改变吗?
最佳答案
您是否有定制的、非标准的背景颜色?如果是这样,您可以看看 http://www.curious-creature.org/2008/12/22/why-is-my-list-black-an-android-optimization/ - 归结为将列表的 android:cacheColorHint 属性设置为背景色。也许这会有所帮助。
经过进一步讨论编辑:
我认为您需要在列表上调用 getAdapter().notifyDataSetChanged() 而不是 invalidate()。列表实际上是以依赖适配器提供数据的方式构建的。你在做什么实际上你有一个隐式适配器 - 条目实际上保存在适配器中并且通过设置检查,你真的在改变数据模型,但是如果你不调用 notifyDataSetChanged() 列表并不真正知道模型已更改且不会重新创建 View (invalidate() 只会重绘现有 View )。
关于android - ListView 项目背景没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553401/