he adapter's contents without calling PagerAdapter#notifyDataSetChanged!

今天在做那个缓存处理的时候,爆出了以下异常:

 

在使用ViewPager时报出The application’s PagerAdapter changed the adapter’s contents without calling PagerAdapter#notifyDataSetChanged

 

于是我们肯定会调用adapter.notifyDataSetChanged,但是会发现,还是报出了 java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged!   

 

当你使用ViewPager来显示网络的图片时,为了用户体验,你肯定一边下载一边更新Adapter。需要注意的是如果这个时候你的ADT版本是22以上的时候,你一定会很纠结:我明明调用了adapter.notifyDataSetChanged,但是还是报出了同样的异常提示。

 

在ADT22中,上面的代码肯定会报错的。原因就要看官方文档对support/v4/view/PagerAdapter的一个解释:

 

          PagerAdapter supports data set changes. Data set changes must occur on the main thread and must end with a call to notifyDataSetChanged() similar to AdapterView adapters derived from BaseAdapter.

 

出错原因是:数据更新必须在main thread(主线程)进行更新!!!结束前还得调用notifyDataSetChanged()!!!

 

 

解决办法:

 

1)将你往集合里面添加数据的代码写到main thread(主线程)里面。

 

2)如果你使用的asynctask 那么你更新集合的代码一定不能再doInBackground方法里面。

 

3)如果你使用new Thread,你的更新集合的代码一定不能再run里面,要在Handler里面。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值