很多新手在Android开发时可能对Thread和Message以及Handler、Looper概念不是很清楚,可能产生类似 The content of the adapter has changed but ListView did not receive a notification make sure the content of your adapter is not modified from a background thread . but only from the UI thread.的错误。在这里给出以下几点可以帮助你了解该问题:

1.改变适配器Adapter内容时不要在后台线程中,必须在UI线程中处理,这点可以通过Handler传出来解决。

2.尝试Adapter的notifyDataSetChanged()方法,当然主要看你代码的具体情况。

以上只貌似只是把错误信息翻译过来而已,真正的原因请看源代码:

mItemCount = mAdapter == null ? 0 : mAdapter.getCount();

..... //中间是其他代码就不拷贝了

else if (mItemCount != mAdapter.getCount()) {//这里可以看出为什么会抛出adapter has changed,是因为你可能还有线程在跑,更新了mAdapter.getCount();的返回值
throw new IllegalStateException("The content of the adapter has changed but "
+ "ListView did not receive a notification. Make sure the content of "
+ "your adapter is not modified from a background thread, but only "
+ "from the UI thread. [in ListView(" + getId() + ", " + getClass()
+ ") with Adapter(" + mAdapter.getClass() + ")]");

============

ps:知其然,知其所以然。刚开始我发现写不写notifyDataSetChanged()都能实现效果,于是我就把它注释了,直到出了问题,我看了以上内容,我就明白为什么会有adapter has changed的提示,也明白了notifyDataSetChanged()的含义。

我的理解是:增加了内容长度改变了 但是没有通知更新 当选中增加的那个内容时 就造成了 数组越界(或者别的问题)

所以添加内容后要更新。

更多相关文章

  1. 【源码分享下载】每日更新之Android源码之百度云推送
  2. Qt for android 开机自启动、开机黑屏处理
  3. android监听网络状态,实时更新网络状态
  4. Android之版本检测和更新
  5. AsyncHttpClient放在子线程执行时抛出异常的解决方法
  6. Android(安卓)Studio中新建项目时Your android sdk is out of da
  7. 推荐4个Android引导页控件
  8. Android初级教程理论知识(第八章网络编程二)
  9. android多线程下载模块

随机推荐

  1. Android中读取properties文件1
  2. Android(安卓)为【apk】文件签名,增加修改
  3. android openmax&surfaceflinger
  4. EvilCode的专栏╭☆╯ -- Android/Linux
  5. Mac Android(安卓)Studio安装教程
  6. Paint常用方法介绍
  7. EditText默认不弹出键盘
  8. Android实现选择本地音乐
  9. Android(安卓)stdio 3.0以上版本将图片文
  10. input 按键分发