从内存角度分析notifyDataSetChanged刷新数据无效

来源:互联网 发布:mac更新 进度条 编辑:程序博客网 时间:2024/04/29 18:03

当我们的界面上有ListVIew这种控件,每当数据源改变时,我们希望调用Adapter的notifyDataSetChanged这个方法,来更新ListView中的数据.但有时候会发现,明明已经调用了这个方法,但是数据却没有任何变化.下面就来详细解释一下为什么会出现这种情况.

通常,我们会创建一个List来提供我们所需要的数据源

List<Object> mList=new ArrayList<Object>();

当程序运行的时候,这句代码做了两件事
(1),在堆内存中创建一个ArrayList<Object>();
(2).在栈内存中创建了一个List类型的引用,并将这个引用指向堆内存中的ArrayList实例.


当我们的数据改变时(一般从网络上获取),如果我们采用下面的错误写法

写法一

List<Object> dataList=(网络获取数据);mList=dataList;adapter.notifyDataSetChanged();

或者
写法二

mList=(网络获取数据);adapter.notifyDataSetChanged();

则ListView不会有任何变化.


原因在于,无论是使用哪种方法,都会试mList的引用发生改变.

前面已经说了,当mList创建的时候,mList是保存在栈内存中的,他里面保存的是一个内存地址,而当我们无论采用写法一还是写法二的时候,都会改变mList的指向.这时候调用adapter.notifyDataSetChanged();时,由于mList的指向已经发生改变,所以adapter无法判断,所以也就不进行刷新了.
那么,如果我们想要在数据发生改变时,ListView能够刷新数据,只需要这样写就可以了

List<Object> dataList=(网络获取数据);mList.clear();mList.addAll(dataList);adapter.notifyDataSetChanged();

这样,当数据发生改变时,我们的ListView就能够正确刷新数据了

0 0
原创粉丝点击