我有一个&#34;看到&#34;的项目列表或&#34;未见&#34;在ArrayList<Item>
。如果他们没有看到我,我会更改ListView
中CustomArrayAdapter
项的背景颜色,如下所示:
if(item.is_seen == null || item.is_seen == 0) {
row.setBackgroundResource(R.color.yellow);
} else {
row.setBackgroundResource(R.color.transparent);
}
现在我要做的是在页面上花费3秒后将所有项目背景设置为透明。
我已经尝试过这样的事情:
mScheduledExecutor.schedule(new Runnable() {
@Override
public void run() {
for(int i=0; i<mItems.size(); i++) {
final Item n = mItems.get(i);
if(n.is_seen == null || n.is_seen == 0) {
// update value in db
int isSeen = 1;
updateItem(n._id, isSeen);
// change the color of backgrounds
View view = listViewItem.getChildAt(i);
if(view != null) {
view.setBackgroundResource(R.color.red);
}
}
}
更新数据库中的值有效,但其余部分不起作用。但是我想避免重新加载数据。我只需要改变颜色。
我没有错误,它什么也没做。
我到处寻找答案,但没有找到答案。 我从一开始就错了吗?我想实现甚至可能吗?
我事先感谢你们给予我的所有帮助。
答案 0 :(得分:0)
而不是像你一样改变视图的颜色,
// change the color of backgrounds
View view = listViewItem.getChildAt(i);
if(view != null) {
view.setBackgroundResource(R.color.red);
}
(上面的代码不起作用,因为视图在ListAdapter中被回收)更新你构建列表的DATA - 向你传递给ListAdapter的类中添加一个属性,然后从列表中获取该实例更新该属性,您已经具备了需要更新的位置,这样很容易。然后,在列表上调用notifyDataSetChanged()。如果您没有从列表中添加/删除项目,它将不会重新绘制列表,但它会为您更新正确的视图。这是唯一的方法 - 绝对没有办法在已经绘制列表之后到达与列表中的特定元素相对应的视图。唯一的方法是使用notifyDataSetChanged()刷新/重绘列表,然后是refreshDrawableState()。