使用多种数据 切换 ,共用一个listView必须注意的三个异常
2013-05-23 10:10
519 查看
背景: 三种类型的数据,经常切换 填充到一个listView上,如图:
![](http://img.blog.csdn.net/20130523095933006)
容易出现三种异常:
1.
这是因为切换 价格 销量 上架时间数据的时候 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);
}
容易出现三种异常:
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);
}
相关文章推荐
- 单链表数据中含有数字字符、字母字符、其他字符三种 。 构造3个循环链 ,使得循环链只有一种字符 。但必须要使用原来单链的结点空间作为三个表的结点空间
- ASP提示 无法从指定的数据表中删除 和 操作必须使用一个可更新的查询?
- java十三周封装一个求一元二次方程根的类SquareEquation,要求考虑解方程的异常,再编写一个窗口类EquationFrame。要求窗口使用三个文本框和一个文本区,其中三个文本框用来显示生更
- SpannableString使用注意(数据重复时,显示异常问题解决)
- 在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。
- 在非英文字符集的页面上,如果使用Ajax方式进行数据交互的话,就必须要注意保证前后端数据的统一编码,否则,很容易就出现乱码!
- 使用常对象——为共用数据加装一个名为const的玻璃罩
- ListView使用ViewHolder时控件数据错乱的注意事项
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- 使用常对象——为共用数据加装一个名为const的玻璃罩
- IBatis 中使用关键字with 报错如果此语句是共用表达式或xmlnamespace字句,那么前一个语句必须以分号结尾
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- 使用常对象——为共用数据加装一个名为const的玻璃罩
- 温补而知新——之(Fragment+ViewPager使用,frgment切换listview数据重复加载问题png)
- Activity在GridView和ListView之间切换使用一个布局实现的方法
- JAVA--第十三周任务一封装一个求一元二次方程根的类SquareEquation,要求考虑解方程的异常,再编写一个窗口类EquationFrame。要求窗口使用三个文本框和一个文本区,其中三个文本框
- [原]用c#做了一个桌面程序用来分离excel文件里的数据时出现“操作必须使用一个可更新的查询”错误的解决
- . 有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列,要求执行效率高,并说明如何改善执行效率(该函数必须自己实现,不能使用php函数)。
- Android中创建一个使用ListView以及用BaseAdapter进行数据适配的程序
- 【Android笔记-异常-4】定义一个临时的数组变量承接数据,ListView的数据以及通知数据更新要放到同一个线程(主线程)。避免出现异常"The content of the adapter