我的ListView
有一个不寻常的问题。我目前有一个“deselectAll()
”方法,它迭代我的ListView中的项目并将它们设置为未选中(项目实现Checkable
接口)。 “已检查”变量被正确更改(视图报告为未被检查),但视觉指示器(在这种情况下,背景更改)不会将视图显示为未选中(背景保持已选中项目的颜色)。
我正在通过我的列表视图进行迭代和取消选择(我还添加了我的文章):
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()函数时,有没有人知道为什么背景不会改变?
答案 0 :(得分:1)
你有背景的自定义,非标准颜色吗?如果是这样,你可以看看http://www.curious-creature.org/2008/12/22/why-is-my-list-black-an-android-optimization/ - 它归结为将列表的android:cacheColorHint属性设置为背景颜色。也许这会有所帮助。
经过进一步讨论后编辑:
我认为你需要在List上调用getAdapter()。notifyDataSetChanged()而不是invalidate()。 List实际上是以依赖适配器提供数据的方式构建的。你正在做的事实上你有一个隐式适配器 - 条目实际上保存在适配器中,并且通过设置选中,你正在改变数据模型,但是如果你不调用notifyDataSetChanged(),那么列表并不真正知道模型已更改并且不会重新创建视图(invalidate()将仅重绘现有视图。)
答案 1 :(得分:1)
在尝试了所有事情后(感谢您的帮助Jarek),我找到了一个适用于我的目的的解决方案。我没有在点击的视图中隐式调用setChecked()
,而是将其留给setItemChecked()
类中的ListView
方法。
我的更新代码:
private void deselectAll() {
for (int i = 0; i < sAdapter.getCount(); i++) {
vw_entryList.setItemChecked(i, false);
}
}
我最好的猜测是ListView
知道它的项实现了Checkable
类,因此需要自己成为所有项操作的处理程序。沿着那条线的东西。如果有人能够更详细地解释为什么这个解决方案有效,而其他人没有,我会用答案和一个upvote奖励他们。