ListView的动态刷新问题——用notifyDataSetChanged没作用

也许很多开发的朋友,尤其是Android初学者(笔者也是个初学者),在动态刷新ListView时,使用notifyDataSetChanged并没有起到作用。有时会被困扰得很痛苦。

其实,在使用notifyDataSetChanged过程中,还是有细节需要注意的。举个例子:

我的ListView使用的数据源是来自ArrayList。通常我们的做法是创建一个已经有我们想要提供给ListView的数据的ArrayList,例如:

1 ArrayList<Integer> list  = new ArrayList<Interger>;
2 list.add(1);

这里我们的list已经是指向了一个堆内存上了。接着我们想要改变list中的数据,而这个时候,就需要注意了,举个例子:我们在代码中有另外一个ArrayList叫做newlist,它是使用下面代码创建出来的:

1 ArrayList<Integer> newlist  = new ArrayList<Interger>;
2 list.add(2);

这个时候,newlist指向的是一个和list指向不同的堆内存,这个时候,我们直接用list = newlist来把newlist的数据交给list,在这里,实际上只是把list的指向改变了,让它也指向newlist指向的那个内存。那么这个时候我们再调用notifyDataSetChanged这个方法来通知listview更新数据就起不了任何作用了,原因很简单,就是list的指向已经改变,而调用notifyDataSetChanged会去检查原来list指向的数据是否变化,但是这时的list已经不是原来的list了,所以它无法判断,只能不作出响应了。那么,这个问题的解决方法是直接在原来的list上面更改数据,可以使用下面的代码来操作:

1 list.clear();
2 list.addAll(newlist);
3 adapter.notifyDataSetChanged();

这样,list的指向就不会改变,它还是指向原来那块内存,这样调用notifyDataSetChanged()就可以起作用了。

总结:在这里的重点就是要注意在开始时传给ListView的list指向不能被改变,需要从始至终指向同一个内存,这样调用notifyDataSetChanged后就能够检测到list的数据变化,从而触发ListView的重新绘制了!

原文:http://blog.csdn.net/wuzhipeng1991/article/details/38820647

时间: 2024-10-12 23:58:10

ListView的动态刷新问题——用notifyDataSetChanged没作用的相关文章

Android UI组件----自定义ListView实现动态刷新

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3910541.html 联系方式:[email protected] [正文] 一.具体步骤: (1)在activiy_main.xml中加一个ListView控件:再添加一个item的模板activity_main_item.xml,加一个底部加载的视图activity_main_load.xml

浅析:ListView的动态刷新问题

也许很多开发的朋友,尤其是Android初学者,在动态刷新ListView时,使用notifyDataSetChanged并没有起到作用.有时会被困扰得很痛苦. 其实,在使用notifyDataSetChanged过程中,还是有细节需要注意的.举个例子: 我的ListView使用的数据源是来自ArrayList.通常我们的做法是创建一个已经有我们想要提供给ListView的数据的ArrayList,例如: 1 ArrayList<Integer> list  = new ArrayList&l

ListView局部更新(非notifyDataSetChanged)

package com.example.test; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.Menu

ListView数据动态刷新

在Android开发中用到ListView时,经常遇到要更改ListView内容的情形,比如删除或增加ListView中显示的条目,这里给大家提供一下思路:不论ListView要显示的对象是什么(如:Cursor或Array或List),要实现ListView数据的更新,都要手动去更改要显示的数据对象,然后调用相应的方法(如:requery()或notifyDataSetChanged())来刷新ListView.针对不同的情形,下面给出相应解决办法的关键代码: 1.用ListView来显示数据

Shiro的 rememberMe 功能使用指导(为什么rememberMe设置了没作用?)

问题 shiro中提供了rememberMe功能,它用起来是这样的 [java] view plaincopy UsernamePasswordToken token = new UsernamePasswordToken(loginForm.getUsername(),loginForm.getPassword()); if(loginForm.getRememberMe() != null && "Y".equals(loginForm.getRememberMe(

thinkPHP5.0中使用header跳转没作用

我在controller中的方法中这样写: header("Location:".$url); 但是一直没动静,不会跳转,最后还是官方文档解决了 https://www.kancloud.cn/manual/thinkphp5/118051 使用 $this->redirect($url,302); 但是不明白为什么 原文地址:https://www.cnblogs.com/ningqing2015/p/9958002.html

解决ul下的li换行问题,(父元素div加overflow:scroll没作用的问题)

#left, #right { width: 50%; box-sizing: border-box; min-height: 100%; float: left; overflow: scroll;//必须写} #left ul{ float: left;//必须写 display:flex;//必须写 }#left ul > li { display:inline-block;//必须写 list-style: none; box-sizing: border-box; float: lef

listview(3、动态刷新)

listview的动态刷新主要是调用adapter的notifyDataSetChanged. 在下面的例子中除了记录正常的刷新外,还记录一种错误的情况(注释掉的),作为备忘. notifyDataSetChanged除了数据无改变时不起作用,当数据的引用变化时也不起作用.因此在下面那个用数组的例子里,listview不会更新. package com.example.demo_dlv; import java.util.ArrayList; import java.util.List; imp

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

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