log为:

java.lang.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. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(16908298, class com.handmark.pulltorefresh.library.PullToRefreshListView$InternalListViewSDK9) with Adapter(class android.widget.HeaderViewListAdapter)]错误总结
notifyDataSetChanged    public void notifyDataSetChanged() {            mDataSetObservable.notifyChanged();        }

这个方法内部调用了mDataSetObservable

    public void notifyChanged() {        synchronized(mObservers) {            // since onChanged() is implemented by the app, it could do anything, including            // removing itself from {@link mObservers} - and that could cause problems if            // an iterator is used on the ArrayList {@link mObservers}.            // to avoid such problems, just march thru the list in the reverse order.            for (int i = mObservers.size() - 1; i >= 0; i--) {                mObservers.get(i).onChanged();            }        }    }

可以观察到,notifyChanged最终还是调用了mObservers.get(i).onChanged()这是抽象类DataSetObserver中的一个方法。这个方法通知了listview的数据源发生了改变。

这个方法我们知道对于listview的操作中,如果改变了其adapter的数据内容,是需要去notifyDataSetChanged的,有时你的显示操作改变了adapter,对于一般开发者而言是不会忘记notifyDataSetChanged,并且我们注意到为listview重新设置adapter时也会间接调用onchangd()。

那么为何会导致文章开头的错误呢?原来是因为在fargement中使用了listview导致fragement切换时,被destroy,而导致listview被detachwindow,导致了错误的发生。

  // AbsListView@Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        mIsDetaching = true;        // Dismiss the popup in case onSaveInstanceState() was not invoked        dismissPopup();        // Detach any view left in the scrap heap        mRecycler.clear();        final ViewTreeObserver treeObserver = getViewTreeObserver();        treeObserver.removeOnTouchModeChangeListener(this);        if (mTextFilterEnabled && mPopup != null) {            treeObserver.removeOnGlobalLayoutListener(this);            mGlobalLayoutListenerAddedFilter = false;        }        if (mAdapter != null && mDataSetObserver != null) {            mAdapter.unregisterDataSetObserver(mDataSetObserver);            mDataSetObserver = null;        }

更多相关文章

  1. Android(安卓)获取手机应用信息
  2. Robotium 常用方法
  3. 一个android 异步多线程类介绍
  4. android异步下载图片
  5. 调用摄像头拍照并显示
  6. Android上下文Context全解析
  7. Android实现异步加载
  8. bindService的注意事项
  9. android 联系人搜索

随机推荐

  1. jQuery scale div内容(嵌套div)
  2. 第二个表格单元格未与顶部对齐
  3. PHP表单在Internet Explorer中不起作用
  4. html5 canvas绘制圆形印章,以及与页面交互
  5. 在CSDN下载资源,扣了积分,下载的是一个404
  6. 孩子放在父母的兄弟姐妹后面。
  7. HTML5 Web Sockets与代理服务器交互
  8. HTML/CSS: 标签CSS规则w/伪类呈现不一致
  9. HTML5 的应用程序缓存和优势
  10. 通过html5 touch事件封装手势识别组件