ListView项目背景不变

时间:2011-07-01 21:28:15

标签: android listview listviewitem

我的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()函数时,有没有人知道为什么背景不会改变?

2 个答案:

答案 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奖励他们。