`

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里面。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics