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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值