android - ListView 项目背景没有改变

标签 android listview listviewitem

我的 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/

相关文章:

java - 从文件中读取但我在android中没有看到?

android - WebView 未加载 ViewPager

java - 使用 ViewPager2 在 AlertDialog 中自定义 TabLayout

android - ListView子对象可点击冲突

c# - 如何为 ListviewSubItem 设置工具提示

android - 使 View 宽度 wrap_content,但重量不超过 0.5

android - ListView 分隔线和不可点击的项目

Android ListView : scrolling resizes the items in a weird way

WPF ListViewItem.IsMouseOver 不会为整行返回 True

Android 自定义ListView 选中项子项?