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

在使用ListView需要动态刷新数据的时候,经常会用到notifyDataSetChanged()函数。

以下为两个使用的错误实例:

1、

无法刷新:

    private List<RecentItem> recentItems;
    ......
    recentItems = getData()
    mAdapter.notifyDataSetChanged();

正常刷新:

    private List<RecentItem> recentItems;
    ......
    recentItems.clear();
    recentItems.addAll(getData);
    mAdapter.notifyDataSetChanged();

原因:

mAdapter通过构造函数获取List a的内容,内部保存为List b;此时,a与b包含相同的引用,他们指向相同的对象。

但是在语句recentItems = getData()之后,List a会指向一个新的对象。而mAdapter保存的List
b仍然指向原来的对象,该对象的数据也并没有发生改变,所以Listview并不会更新。

2、

我在页面A中绑定了数据库的数据,在页面B中修改了数据库中的数据,希望在返回页面A时,ListView刷新显示。

无法刷新:

   protected void onResume() {
            mAdapter.notifyDataSetChanged();
            super.onResume();
    }

正常刷新:

   protected void onResume() {
           recentItems.clear();
           recentItems.addAll(recentDB.getRecentList());
           mAdapter.notifyDataSetChanged();
           super.onResume();
   }

原因:

mAdapter内部的List指向的是内存中的对象,而不是数据库。所以改变数据库中的数据,并不会影响该对象。


void

notifyDataSetChanged()

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

时间: 2024-10-06 00:29:52

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

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

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

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

使用Listview的时候: 当要动态显示更改后的数据(例如数据库改动), 很多人应该都用过notifyDataSetChanged();这个方法来刷新Listview,显示改后的数据. 这时候就要注意了:                  ......                  private ArrayList<HashMap<String, Object>> usersList;                  ......                  use

C# 实现将listview中已经显示的数据导出到Access 数据库

private void button1_Click(object sender, EventArgs e) { OleDbConnection dbconn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data source=E:\a.mdb"); dbconn.Open(); foreach (ListViewItem lvi in lvLogs.Items) // 遍历整个listview将listview中的

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

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

thinkphp模板中foreach循环没数据的错误解决

从控制器方法中$this->assign();函数将值传递给html模板 但是模板不显示数据,直接出来的是代码,效果就和html中写了php代码不能解析一样. 原来是我将thinkphp框架的引擎和smarty模板引擎的使用方法混了.写成了 查手册知道了thinkphp模板中foreach的使用方法,这才恍然大悟

android Listview,gridview局部刷新,部分刷新

众所周知Listview和Gridview的刷新界面的方式是调用adapter.notifyDataSetChanged()进行界面刷新. 但是此方法有其弊端,他是将界面中的数据全部刷新一遍,不论数据有没有变化.如果listview加载了很多的数据(如:100条) 在进行刷新时就会造成很大的系统开销如何像qq空间个人动态那样点赞只刷新一条呢: 主要原理: 对listview的某一个item进行刷新 1.要获取要刷新的item当前索引position和数据 2.对获取的数据进行重置 3.将重置的数

转 android Listview,gridview局部刷新,部分刷新 (仿QQ动态评论局部刷新)

转自:http://blog.csdn.net/jdsjlzx/article/details/45582719 众所周知Listview和Gridview的刷新界面的方式是调用adapter.notifyDataSetChanged()进行界面刷新. 但是此方法有其弊端,他是将界面中的数据全部刷新一遍,不论数据有没有变化.如果listview加载了很多的数据(如:100条) 在进行刷新时就会造成很大的系统开销如何像qq空间个人动态那样点赞只刷新一条呢: 主要原理: 对listview的某一个i

Android 自定义ListView实现底部分页刷新与顶部下拉刷新

在项目开发中,由于数据过大时,需要进行分页加载或下拉刷新,来缓解一次性加载的过长等待.本篇博文实例讲解通过自定义的ListView实现底部分页加载和顶部下拉刷新的效果. 其效果图: 一.ListView 底部分页加载 整个底部分页加载,主要分一下几步: 1.加载底部自定义View; 2.响应OnScrollListener监听事件,onScroll方法记录最后可见的View Item以及整个totalItemCount.当onScrollStateChanged状态改变时, 当滑动到底端,并滑动

listview,gridview局部刷新,部分刷新

众所周知Listview和Gridview的刷新界面的方式是调用adapter.notifyDataSetChanged()进行界面刷新. 但是此方法有其弊端,他是将界面中的数据全部刷新一遍,不论数据有没有变化.如果listview加载了很多的数据(如:100条) 在进行刷新时就会造成很大的系统开销如何像qq空间个人动态那样点赞只刷新一条呢: 主要原理: 对listview的某一个item进行刷新 1.要获取要刷新的item当前索引position和数据 2.对获取的数据进行重置 3.将重置的数