您的位置:首页 > 移动开发 > Android开发

使用多种数据 切换 ,共用一个listView必须注意的三个异常

2013-05-23 10:10 519 查看
背景: 三种类型的数据,经常切换 填充到一个listView上,如图:



容易出现三种异常:

1.

java.lang.ArrayIndexOutOfBoundsException 数组角标越界 在一个数据类型下 滑到后面最后面几条
这是因为切换 价格 销量 上架时间数据的时候 productAdapter 就不是空的,那么就是notifyDataSetChange()

这个方法只会局部的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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  listview 多线程 android
相关文章推荐