使用notifyDataSetChanged()不更新ListView项目

时间:2013-12-28 08:10:59

标签: java android android-listview

显然notifyDataSetChanged()只更新listview中的可见项目,我有一个系统可以在点击项目时改变项目的背景颜色(到dkgray),我将其他所有内容都设置为透明(默认值),但是其他不可见的项目仍然是选中的(dkgray)(我只希望当前选择的项目是dkgray)。有没有办法强制notifyDataSetChanged()更新所有项目。

以下是示例:

//makes all item backgrounds transparent
public void resetListViewBackground(){
    for (int i = 0; i < listView.getChildCount(); i++){ //parent.getChildCount()
        listView.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
    }
}

//reloads the listview
private void reloadListView() {
    listItems.clear();
    adapter.notifyDataSetChanged();
    listView.invalidateViews();

    ArrayList<HashMap<String, String>> notesArrayList = dbTools.getAllNotes();
    for (int i = 0; i < notesArrayList.size(); i++){
        String temp = "";
        if (notesArrayList.get(i).get("note").length() > 51){
            temp = notesArrayList.get(i).get("note").substring(0,50).toString() + "...";
        } else {
            temp = notesArrayList.get(i).get("note").toString();
        }
        listItems.add(temp);
        adapter.notifyDataSetChanged();
    }
}

我打电话给resetListViewBackground()的所有地方,之后我致电reloadListView()。 这就是我用来突出显示所选项目的内容。

view.setBackgroundColor(Color.DKGRAY);

此外,此问题最常见的情况是每6个项目都会突出显示。 listview一次仅显示约4个项目。

1 个答案:

答案 0 :(得分:0)

由于视图回收已完成,getChildCount()方法不适用于所有列表项。 Astral在评论中写道是正确的。

1)创建自定义适配器。(参见http://windrealm.org/tutorials/android/listview-with-checkboxes-without-listactivity.php

2)在onListItemClick侦听器的onItemClick()方法内,调用适配器的notifyDataSetChanged()方法(每当用户单击列表项时)。

我修改了我提到的项目并将其发布到我的Dropbox上。(只需在Eclipse中导入并运行)。 请查看https://www.dropbox.com/s/gchccjzpkxk8n2z/Planets_modified.zip