关于ListView中notifyDataSetChanged()刷新数据不更新


独立开发app是很好的提升自身的方式,当然,配上阅读,效果更佳;

这是一个折腾了我一下午的问题,知道看到了这篇帖子,慢慢有了眉目:戳我

首先叙述一下过程,我是一个ViewPager里面包含了7个ListView,之前我考虑是不是网上的那种adapter出了问题,后来仔细想,不可能,因为在链表中添加一个数据是可以动态刷新显示的。

所以,问题来了,我添加数据时代码是这样:

private List<List> recordList = new ArrayList<>();
private List<MyListViewAdapter> adapterList = new ArrayList<>();
。。。。。
//将更新的数据插在头部
recordList.get(curretItem).add(0, recordMsg);
adapterList.get(curretItem).notifyDataSetChanged();

这是没毛病的,很容易看出,RecordList是一个ArrayList包含了7个list<对象>,同时对应了7个adapter,每个adapter分别持有一个list<对象>,但是当有其他需求需要这样,清空RecordList中的每一个list<对象>,并重新放入对应的list,意思是替换以前的7个,我之前是这样写的:

recordList.clear(); //问题出在这里,直接将之前的7个从内存移除了
for (int i = 0; i < 7; i++) {
 List<Record> tmp = (List<Record>) findRecordByDay(dateList.get(i) + "");
 recordList.add(tmp); 
}
adapterList.get(curretItem).notifyDataSetChanged();

这种方案的结果是,无论如何,都是以前的值,不会刷新。于是尝试另外一种:

for (int i = 0; i < 7; i++) {
 List<Record> tmp = (List<Record>) findRecordByDay(dateList.get(i) + "");
 recordList.get(i).clear();
 recordList.set(i,tmp); //问题出在这里,直接把那7个list替换了 
}
adapterList.get(curretItem).notifyDataSetChanged();

这种是,第一次执行可以刷新数据,第二次便无法再次刷新

当谷歌半天看到那帖子时开始有点懵,后来想了下,道理是一样的,那几个list不能更改引用,一旦更改便无法再次调用。

最后这是解决方案

for (int i = 0; i < dateList.size(); i++) {
 List<Record> l = (List<Record>) findRecordByDay(dateList.get(i) + "");
 recordList.get(i).clear();
 for (int j = 0; j<l.size(); j++) {
 recordList.get(i).add( l.get(j));
 }
}

数据结构确实是个好东西,但是多少人在接触的时候认为其没有用。。。特此记录2017.7.9

2017.7.11

一次偶然的机会在另一个界面开发的时候又发现了这个问题,后来仔细的阅读了下list的api后,发现了更加简单的办法:

使用list.addAll();

add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素

 result.addAll(list);//把list中的每一个元素加到result中,result.size()==list.size()

addAll是传入一个List,将此List中的所有元素加入到当前List中,也就是当前List会增加的元素个数为传入的List的大小

 result.add(list);//将list作为一个元素加到result中,则result.size()为1

即:

 addAll(Collection c)

 add(int index,Elelemt e)

--------------------------------------

addAll(Collection c) 此方法按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

所以我的代码最后改成了这样:

for (int i = 0; i < dateList.size(); i++) {
 recordList.get(i).clear();
 recordList.get(i).addAll(findRecordByDay(dateList.get(i) + ""));
 }

声明:TIL|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA[ZH]协议进行授权

转载:转载请注明原文链接 - 关于ListView中notifyDataSetChanged()刷新数据不更新


Life is very interesting. In the end, some of your greatest pains become your greatest strengths.