2011-07-01 153 views
3

我有一个不寻常的问题,我的ListView。我目前有一个“deselectAll()”方法,它遍历我的ListView中的项目,并将它们设置为未选中(项目实现Checkable接口)。 “checked”变量得到正确更改(视图报告为未被检查),但视觉指示器(在本例中为背景更改)不显示视图为未选中状态(背景保持选中项目的颜色)。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(); 
} 

我能看到的唯一区别是在方法从名为。在OnItemClickListener.onClick()方法中调用toggle(),而我的deselectAll()是从同一个类中的按钮标准OnClickListener中调用的。 有没有人有任何想法,为什么当我调用我的deselectAll()函数后,背景不会改变?

回答

1

尝试完所有事情之后(感谢您的帮助Jarek),我找到了适用于我的目的的解决方案。不是在被点击的视图中隐式调用setChecked(),而是将其保留在ListView类中的setItemChecked()方法中。

我更新的代码:

private void deselectAll() {   
    for (int i = 0; i < sAdapter.getCount(); i++) { 
     vw_entryList.setItemChecked(i, false); 
    } 
} 

我最好的猜测是,ListView知道其项目实施Checkable类,因此需要自己是所有项目操作的处理程序。沿着这些线的东西。如果任何人都可以更详细地解释为什么这个解决方案可以工作,而其他人不这样做,那么我会用答案和赞成来奖励他们。

1

你有背景的自定义非标准颜色吗?如果是这样,你可以看看http://www.curious-creature.org/2008/12/22/why-is-my-list-black-an-android-optimization/ - 它归结为将你的列表的android:cacheColorHint属性设置为背景颜色。也许这会有所帮助。

后进一步讨论编辑:

我认为你需要调用getAdapter()notifyDataSetChanged()的列表,而不是无效()。 List的构建方式是依靠适配器来提供数据。你在做什么实际上你有一个隐含的适配器 - Entry实际上保存在适配器中,并且通过设置检查,你真的正在改变数据模型,但是如果你不调用notifyDataSetChanged(),那么这个列表并不真的知道模型已经改变并且不会重新创建视图(invalidate()将只重绘现有视图)。

+0

背景是我从XML创建的状态列表可绘。出于某种原因,我无法获取state_checked状态,因此我实现了一个可绘制的名为listview_checked的单独状态列表,然后切换代码中的资源。不幸的是,这个cacheColorHint属性并没有影响任何东西,链接是一个很好的阅读,但我认为与我的问题无关。这很让人困惑,因为更改onItemClickListener中的可绘制背景工作正常。尽管感谢有趣的链接。 –

+0

我想你会做的更好,然后通过不改变背景,但通过简单地添加一个“选中的颜色”“fill_parent”视图到您的列表项目,并使其状态变为可选/不可见状态时更改为选中/取消选中 –

+0

即使在此更改后(VISIBLE/INVISIBLE切换),视图不会改变背景。嗯,我会继续努力。 –