容易出现三种异常:
1.
java.lang.ArrayIndexOutOfBoundsException 数组角标越界 在一个数据类型下 滑到后面最后面几条 |
这个方法只会局部的listView,由于切换了数据类型 所以导致数据 没有那么多,这种情况下,在切换时候都要把productAdapter=null;
2.在做 加载更多时候 操作了FooterListView 或者HeaderListView 容易出现
java.lang.ClassCastException: com.xxx.adapter.ProductGridAdapter cannot be cast to android.widget.HeaderViewListAdapter
这是因为在listview.setAdapter(adapter)方法之后 添加头或尾view,即addHeaderView或 addFooterView,
那么在你listView.removeHearderView或removeFooterView时就会报该异常。
在Listview的源码中如果设置了adapter,那么它会强转成HeaderViewListAdapter,所以就会报错。
if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeHeader(v)) {
if (mDataSetObserver != null) {
mDataSetObserver.onChanged();
}
result = true;
}
所以在 调用listview.setAdapter(adapter)之前就要调用 addHeaderView或 addFooterView 在删除之前可以做一些安全判断如:
if(mListView.getFooterViewsCount()>0&&mListView.getAdapter()!=null){
mListView.removeFooterView(loadMoreView);
}
3.
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.
[in ListView(2131362203, class android.widget.ListView) with Adapter(class android.widget.HeaderViewListAdapter)]
可能出现的原因:
1.1 在子线程更新了ListView数据
1.2 在listView快速滑动时候,多线程环境下 这个线程更新了adapter 里面的数据,但是notifyDataSetChange还没来得及通知,下一个线程有再次更新数据,
所以导致了java.lang.IllegalStateException 解决办法就是:就是必须在Handler里面整理将要设置的给adapter的数据,设置adapter数据,notifyDataSetChange
必须在在一起完成!
以下全部在Handler 完成:
第一步:获取数据: ArrayList<Netable> proList = mNetable.getProList();
size =null!=proList?proList.size():0;
if( null!=proList&&!proList.isEmpty()){// 再取到新的数据的时候才 去填充
第二步: if(mNetableList==null){
mNetableList=proList;
}else{
mNetableList.addAll(proList);
}
pag_price++;// 页数 加1
}
第三步:if(productGridAdapter==null||mListView.getCount()==0){
if(mListView.getFooterViewsCount()==0){
mListView.addFooterView(loadMoreView);
}
productGridAdapter=new ProductGridAdapter(ProductGridActivity.this, mListView, mNetableList);
mListView.setAdapter(productGridAdapter);
}else{
productGridAdapter.setNetables(mNetableList);
productGridAdapter.notifyDataSetChanged();
}
if(mListView.getFooterViewsCount()>0&&mListView.getAdapter()!=null&&pag_price>1){
mListView.removeFooterView(loadMoreView);
}