【转】关于ListView中notifyDataSetChanged()刷新数据不更新原因

使用Listview的时候: 当要动态显示更改后的数据(例如数据库改动), 很多人应该都用过notifyDataSetChanged();这个方法来刷新Listview,显示改后的数据.

这时候就要注意了: 
                 ...... 
                 private ArrayList<HashMap<String, Object>> usersList; 
                 ...... 
                 usersList= query(......);     //根据查询函数获取一个ArrayList并赋值给绑定到Adapter的数据源usersList 
                 sAdapter.notifyDataSetChanged(); 
                 ......

如果你也是:   上面这种形式去刷新ListView的数据的话, 是不可以更新的. 必须改成如下形式:

...... 
                //usersList= query(......);    
                 usersList.clear();  
                 usersList.addAll(query(......)); 
                 sAdapter.notifyDataSetChanged();

///////////////////////////////////////////////////////////////////////////////////////

原因是:    sAdapter会通过usersList获取List中的内容。但是实际上可能(也应该)是,在调用super(MyActivity.this, R.layout.item, usersList)时sAdapter保存了usersList指向原List(假设为List a)的引用,在调用query函数之后,usersList指向了一个新的List(List b)。但是在调用notifyDataSetChanged()时,sAdapter会跟据保存的引用(即指向List a的引用)去更新,因此当然还是原来的结果,不会进行更新。

如果大家也出现这种情况可以使用后者去刷新ListView, 应该就没问题了

时间: 2024-10-25 15:39:50

【转】关于ListView中notifyDataSetChanged()刷新数据不更新原因的相关文章

ListView中notifyDataSetChanged()刷新数据不更新原因分析

情景分析: 在开发过程中,我们经常会使用notifyDataSetChanged()实时的让ListView进行刷新操作,但是有的时候却会发现ListView不再刷新了,有的时候却又可以自动刷新. 原因分析: 如上图所示,传递给Adapter的List引用一开始为引用a,但是,当我们在程序中执行刷新更换数据的时候,如果一不小心将List的引用换成了引用b的话,就会导致上述情景的发生.那是因为Adapter刷新的时候,还是用得引用a的数据,而不是引用b: 解决思路: 思路1: 在Adapter中为

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

使用Listview的时候: 当要动态显示更改后的数据(例如数据库改动), 很多人应该都用过notifyDataSetChanged();这个方法来刷新Listview,显示改后的数据. 这时候就要注意了: ...... private ArrayList<HashMap<String, Object>> usersList; ...... usersList= query(......);     //根据查询函数获取一个ArrayList并赋值给绑定到Adapter的数据源us

Qt Quick之ListView下拉刷新数据

Qt Quick里的ListView,本身是Flickable的派生类,当你用鼠标拖曳或者手指触摸(触摸屏)时,会产生flickStarted和flickEnded两个信号,利用这两个信号,就可以实现下拉刷新数据,当然上拉刷新也是可以的. 创建一个Qt Quick App项目,添加dynamicModel.h和dynamicModel.cpp两个文件,用于实现DynamicListModel.项目创建过程参考<Qt Quick 之 Hello World 图文详解>. 我们实现的下拉刷新效果有

ListView中notifyDataSetChanged()无法刷新数据的错误实例

在使用ListView需要动态刷新数据的时候,经常会用到notifyDataSetChanged()函数. 以下为两个使用的错误实例: 1. 无法刷新: private List<RecentItem> recentItems; ...... recentItems = getData() mAdapter.notifyDataSetChanged(); 正常刷新: private List<RecentItem> recentItems; ...... recentItems.c

Android ListView中带有时间数据的排序

private ListItem listItem; listItem = new ListItem(); listItem.setReleasetime(releasetime); List<ListItem> listItems = new ArrayList<ListItem>(); Collections.sort(listItems, new Comparator<ListItem>() { @Override            public int co

前台传来的新数据与数据库中的旧数据比较更新算法

工作中遇到一个很小的功能,发现写好还有点难度,经过一晚上的思考,把成果记录下. 问题: 数据库中保存了一些数据,前台更新操作传来新的数据.如何比较差异,进行更新.如: 前台传来1,2,3,数据库中有3,5.则需要在数据库中增加1,2:在数据库中删除5:原有数据3不变. 解决方法一: 先把数据库中原的数据全部清空,然后把前台的数据全部执行插入. 这种方法简单,很容易理解,以及判断及正确性.缺点是如果原数据库数据较多,则重复删除后增加,则效率不高. 解决方法二: 查询原数据库中的数据,做为待删除的列

C#在listview控件中显示数据库数据

一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 设置一列的Text属性,这就是列名 添加三列 3.编辑items属性,添加一行数据 编辑Text属性,添加一行的第一个数据 编辑subitems属性,添加一行中的其他数据 添加两个数据 填写结果 二.在listview中显示数据库数据 //在listview中显示数据库数据 private voi

Android 编程之天气预报下来刷新数据及城市容器配置--3

前面已经把活动和服务讲了讲,要注意的是服务的用法,我们在这里是 extends IntentService implements LocationListener ,下面看下 IntentService IntentService是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会停止自己(一般在工作完

Android实战简易教程-第十五枪(实现ListView中Button点击事件监听)

1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" androi