adapter的notifyDataSetChanged()无法正常更新listview的原因和解决方案

本文探讨了在Android开发中,如何有效解决ListView动态加载更多条目时的更新问题。提供了两种解决方案,一是重新初始化适配器,二是正确地修改数据源以确保适配器能响应数据变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        本人在开发中,通过联网获取新闻列表,会遇到需要动态增加listview的条目项的问题。我们一般都是通过adapter绑定一个数据源,以SimpleAdapter为例

SimpleAdapter adapter = new SimpleAdapter(this.mContext, mStrings,
		R.layout.info_list_item, new String[] { "heading", "date" },
		new int[] { R.id.infoheading, R.id.date });


      其中mStrings是一个ArrayList,在尾部需要加载更多时,采用联网获取新条目然后加到旧的listview中去。然后在主线程(更多时候是Handler类里)中使用adapter.notifyDataSetChanged()通知ListView数据源有改动,需要更新。

      但是有时候在使用过程中却出现notify之后ListView却没有相应更新。


解决方案有2种:

1.重新初始化adapter,即在完成数据的添加后,在主线程(Handler类)中重新初始化并绑定数据:

adapter = new SimpleAdapter(this.mContext, mStrings,
				R.layout.info_list_item, new String[] { "heading", "date" },
				new int[] { R.id.infoheading, R.id.date });
mListView.setAdapter(adapter);
但是这样有一个问题,就是如果我在ListView的尾部添加了数据,重新setAdapter之后,视图中当前显示的条目会立马回到最顶的一条,这在用户已经下滑到下面之后是一个不太好的体验。

2.另一种方案就是检查你的代码,找到导致notify方法失效的原因。检查是否在更新mString这个ArrayList时直接使用了mStrings = newString这样的代码。这个代码看上去确实更改了mString中的数据,但却产生了一个新的问题,也就是导致notify方法失效的问题:当你初始化mStrings方法即ArrayList<<>> mStrings = new ArrayList<<>>()时,新建了一个ArrayList对象Obj1并将mStrings指向了它,同时Adapter初始化时也就将Adapter的数据源指向了Obj1。而在你尝试动态更改mStrings时使用了mStrings = newStrings,也就是将mStrings的指针指向了新的newStrings,必然不再是Obj1了。此时你觉得更改了mStrings的值,但事实上并未更改到adapter绑定的数据源里的数据。


弄明白了这点,只需要找到你的代码中所有采用指向新对象方式更改mStrings的值,改为

mStrings.clear();
mStrings.addAll(newStrings);

就可以了。在开发过程中,也应尽量使用mStrings.add(),remove,clear等方法,以保证你更改的数据源和adapter绑定的对象为同一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值