Android 调用notifyDataSetChanged方法失败解决办法

Android 调用notifyDataSetChanged方法失败解决办法

如果使用ListView、GridView等进行数据展示,当绑定的数据有了更新的时候,需要实时刷新ListView,即调用Adapter的notifyDataSetChanged方法,但是很多人在调用之后会发现ListView是数据并没有刷新,这是什么原因呢?下面将对其进行详细解释。

1、数据源没有更新,调用notifyDataSetChanged无效。
2、数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效。
3、数据源更新了,但是adpter没有收到消息通知,无法动态更新列表。

一个典型的错误是:

list = new String[]{"listView item"}; adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list); listView.setAdapter(adapter); list = new String[]{"new listView item"}; adapter.notifyDataSetChanged();

原先一直以为adapter会监听list的变化,当重新初始化list之后,ListView会自动进行数据的刷新,其实不然,adapter监听的是new String[]{"listView item"}的变化。adapter本身会保存一个对原始数据源(new String[]{"listView item"})的内部引用inner_list。

当执行了list = new String[]{"new listView1 item"};语句之后,重新初始化了list,也就是相当与切断了list与原始数据源(new String[]{"listView item"})的关系,因此之后调用notifyDataSetChanged并不会起作用,因为list 和inner_list已经是存在于堆上的完全不同的两个对象了。

错误回顾:

前段时间都是使用的Arrayist等等作为原始数据源,一般都是进行add之类的操作,所以list和inner_list和一直都是保持对同一个变量的引用,并没有出什么问题,当然,改为直接赋值就会出现调用无效的问题。所以要针对原始数据对象进行操作,而不是重新赋值。

看了一下Arrayadapter的源码:

ArrayAdapter: public ArrayAdapter(Context context, int textViewResourceId, T[] objects) { init(context, textViewResourceId, 0, Arrays.asList(objects)); } Arrays: public static <T> List<T> asList(T... array) { return new ArrayList<T>(array);//注意这里的ArrayList不是常见的那个ArrayList,而是Arrays的一个内部类。。 }

以上就是Android 调用notifyDataSetChanged方法失败的常见原因及解决办法的总结,如有疑问希望大家留言讨论,或者到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-09-24 17:24:13

Android 调用notifyDataSetChanged方法失败解决办法的相关文章

ExtJS调用focus方法无效解决办法

在BoxComponent文档中对focus方法的说明如下:  代码如下 复制代码 focus( [Boolean selectText], [Boolean/Number delay] ) : Ext.Component Try to focus this component. 可以看到这个方法有两个可选的参数,第一个的含义是是否全选中所在的文本内容(默认为false),第二个是设置一个延迟的时间,单位是毫秒(默认为0,不延迟).下面是两种调用的方法:  代码如下 复制代码  var text

迅雷快鸟加速失败如何解决 迅雷快鸟加速失败解决办法

加速失败原因通常如下 1.加速请求的源连接我们并没有找到或丢失了 2.速器版本有问题系统存在的bug 迅雷快鸟加速停止解决办法 1.尝试安装最新版本的 迅雷快鸟 2.因为网络线路问题我们可以重启路由器了以让我们的dns与ip刷新以让迅雷快鸟找到资源链接 3.如果都解决不了可以尝试使用360LSP修复工具修复LSP重置网络后,重启电脑尝试 好了到了这里关于迅雷快鸟加速失败解决办法也就介绍完了,希望上面总结的方法可以帮助到各位朋友的哦.

苹果iTunes不能备份iphone怎么办?iTunes备份失败解决办法

注意:小编测试的是ios7越狱之后的出现itunes备份失败解决办法了. 方法1.在地址栏输入:C\ProgramData\Apple\Lockdown将电脑中这个的文件下的文件全部删除(目测文件夹下全是一些plist文件). 方法2.重启itunes,就可以进行越狱后的恢复备份了. 方法3.越狱前备份也毫无问题. 当然我们还可以使用pp助手来备份数据了 1.将设备连接电脑打开PP越狱助手--备份还原--备份--勾选需要备份的信息. PP越狱助手将会备份iPhone中的以下内容: 通信录.通话记

彩视分享失败解决办法

  很多人都在使用彩视这个手机应用,不过有用户在使用过程中,发现彩视分享失败.那么, 彩视分享失败怎么办?今天,就一起来看看彩视分享失败解决办法. 彩视分享失败解决办法 彩视分享失败怎么办? 原因一:网络问题,请检查网络. 原因二:版本过旧问题,请检查更新彩视最新版本软件. 原因三:软件不兼容,切换手机操作系统尝试一下. 原因四:软件故障,卸载彩视app再重装. 原因五:重新授权账号,可能是由于账号授权过期 原因六:咨询官方客服等待解决.

360驱动大师驱动下载安装失败解决办法

  下载安装失败解决办法: 驱动下载安装失败,可能是驱动程序并不适合你的硬件或系统环境,这时候可以恢复到原来的驱动或者另外下载手动下载合适的驱动.在安装新的驱动前最好备份原有驱动,以防安装失败无法恢复

打印数据获取(压缩)失败解决办法

  打印数据获取(压缩)失败解决办法: 1.检查c:windows文件夹下,有没有Temp文件夹,如果没有,则需要新建一个 2.桌面云雀图标->鼠标右键->以管理员权限运行 3.如果还不行,那么一般你是win8系统,你再看看c:windowsTemp 文件夹->鼠标右键->属性->安全 ,user/(你的windows用户名) 是不是没有'修改''写入'两个权限,如果没有,都改成有.然后再试试云雀打印. 如果win7,win8系统遇到不能修改文件夹权限,请看下面的教程: 默认

Cisco AnyConnect VPN Client 安装失败解决办法

安装失败 公司最近隔离了内外网,访问公司内网需要用vpn. 用就用吧,按说明下个Cisco AnyConnect VPN Client. 就在安装快要完成,启动服务时,出现了如下的提示.死活不能进行下一步. The VPN client agent was unable to create the interprocess commuication depot 链接失败 拨号时提示"所尝试的连接操作已失败". 解决办法: 查了一下资料,找到了解决办法: 关掉ICS(internet c

Windows 8系统更新导致virtualbox启动失败解决办法

win8补丁kb3045999导致virtualbox无法启动怎么办?据用户提出在win8系统中打上补丁kb3045999会导致virtualbox无法启动,virtualbox提示:NtCreateFile(DeviceVBoxDrvStub) failed: Unkown Status - 5600 (0xffffea20) (rcNt=0xe986ea20):VBoxDrvStub error: ntdll.dll: 7982 differences between 0x300c and

Android 手机无法连接mac解决办法_Android

Android 手机无法连接mac解决办法 一般的android连接mac 很方便不用安装驱动就可以啦,可是不知道为什么二般情况下有的android手机(小米2,华为等)就是连接不上,下来就说说二般情况下如何连接. 1.关于本机-->更多信息->概系统览->系统报告->usb->你所连接的device-->供应商ID(Vendor ID) 2.终端执行如下命令:     echo 0x2717 >> ~/.android/adb_usb.ini 3.重启 a