listview调用notifyDataSetChanged之后不刷新

来源:互联网 发布:淘宝联盟2016旧版 编辑:程序博客网 时间:2024/05/17 21:43

从源头做起,避免改变List的引用,将新生成的引用b的数据,调用List的addAll(…)方法,全部更新到引用a里面,这样子就可以让引用a的数据实时刷新,之后再调用notifyDataSetChanged(),也就可以实现我们的刷新效果了。

我们经常new 一个adapter时候直接把我们的数据list传入。如:

                 

if (adapter == null) {    adapter = new XXXXXAdapter(XXXXX.this, clueLists);    myClueList.setAdapter(adapter);    adapter.notifyDataSetChanged();} 
else {    adapter.setList(clueLists);    adapter.notifyDataSetChanged();}

一般我都会写一个set () 来实现实时的刷新数据; 但是这次我出现了一个问题 ,开始的时候加载更多还没有问题  多刷几次就会出现问题  ,数据没有问题  就是没有刷新出来


这是我们第一次初始化ListView各个item的常见调用,但是如果我们之后要变化ListView的展示呢,比如常见微信朋友圈再加载、、、、这种就是我们需要我们刷新ListView的展示。那我们怎么刷新ListView的展示呢?那就是调用adapter的notifyDataSetChanged方法,调用notifyDataSetChanged后ListView就会根据我们最新的mList数据来绘制我们新的ListView。

         关键问题来了,为什么我们只调用notifyDataSetChanged就可以实现ListView的刷新,我们并没有像刚开始那样把我们修改后的mList再进行传递给adapter?

       哈哈,其实要是知道了这个原理也就可以理解我们今天要讨论的问题关键,其实这还是涉及我们java中的参数传递问题。下面我们分步骤说明:

 1、 初始化了clueListsAll= new List<T>();

 2、 mXXXListAdapter = new XXXListAdapter(mContext,clueListsAll);//把mList传递给了adapter,这时adapter里面也有相应list对象,实际上adapter的list只是一个引用也指向mList指向的内存空间

 3、当clueListsAll数据修改完毕后(指的开始clueListsAll指向的内存空间数据修改而不是clueListsAll指向其他内存空间),然后调用notifyDataSetChanged通知adapter去刷新,这时adapter的list也是指向开始clueListsAll指向的那一块内存空间去刷新ListView


所以说调用notifyDataSetChanged出现ListView不刷新问题根源在于mList指向了其他内存空间,而不是修改了原指向内存空间内容。

下面通过代码给大家说明一下:

                 clueListsAll = new List<T>();

                 clueListsAll.add(T);

                 mXXXListAdapter = new XXXListAdapter(mContext,mList);

                   setAdapter(mXXXListAdapter);


修改数据mList数据:

clueListsAll = clusLists;//错误,让clueListsAll指向了其他内存空间,调用notifyDataSetChanged出现ListView不刷新

clueListsAll.add(therList.get(0));//正确修改方法clueListsAll只是修改了内存空间的内容,调用notifyDataSetChanged出现ListView会刷新

阅读全文
1 0
原创粉丝点击