自定义BaseAdapter完美解决ListView异常:java.lang.IllegalStateException
2019独角兽企业重金招聘Python工程师标准>>>
在我们Android 开发中,ListView是在常用不过的控件了。但是有时候会爆出这种异常,就搞得好尴尬了。 明明我们在代码中的确是有调用adaptor.notifyDataSetChanged()这个方法的,明显没问题啊。 后来我查代码,才发现,在我们更新过程中大部分使用到的是异步操作,但是如果网络很卡,然后又发出了大量的请求的话,那么就会出现这个问题。要怎么解决这个问题呢?
#这是代码
import java.util.ArrayList;
import java.util.List;import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;/*** @author 肖蕾* @param <DataType>* 传入的数据类型* @param <viewHolder>* ViewHoler的类型*/
public abstract class BaseAdapter<DataType, viewHolder extends BaseAdapter.Holder> extends android.widget.BaseAdapter
{/*** 保存的数据*/private List<DataType> list = new ArrayList<DataType>();private List<DataType> outer_list;public BaseAdapter(List<DataType> list){this.outer_list = list;this.list.addAll(outer_list);}@Overridepublic int getCount(){return getItemCount();}@Overridepublic DataType getItem(int position){return list.get(position);}@Overridepublic long getItemId(int position){return position;}@Overridepublic void notifyDataSetChanged(){this.list.clear();this.list.addAll(outer_list);super.notifyDataSetChanged();}/*** View 的创建* * @param parent* 父控件* @param viewType* 类型* @return*/public abstract viewHolder onCreateViewHolder(ViewGroup parent, int viewType);/*** ViewHolder与数据的绑定* * @param holder* viewHoler对象* @param data* 数据* @param position* 定位*/public abstract void onBindViewHolder(viewHolder holder, DataType data, int position);public int getItemCount(){if (list == null){return 0;}return list.size();}public int getItemViewType(DataType data, int position){return super.getItemViewType(position);}@SuppressWarnings("unchecked")@Overridepublic View getView(int position, View convertView, ViewGroup parent){viewHolder holder = null;DataType data = list.get(position);if (convertView == null){holder = onCreateViewHolder(parent, getItemViewType(data, position));convertView = holder.getRootView();} else{holder = (viewHolder) convertView.getTag();}onBindViewHolder(holder, data, position);return convertView;}public static class Holder{private View root;private SparseArray<View> store = new SparseArray<View>();@SuppressWarnings("unchecked")public <T extends View> T get(int id) {View result = store.get(id);if(result == null){result = root.findViewById(id);store.append(id, result);}return (T) result;}public Holder(View view){this.root = view;}public View getRootView(){root.setTag(this);return root;}}
}
#使用方法
public class mAdapter extends BaseAdaptor<String, BaseAdaptor.Holder>
{public mAdapter(List<String> list){super(list);}/*** 新建一个ViewHoler*/@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){View view = View.inflate(parent.getContext(), R.layout.item, null);Holder holder = new Holder(view);return holder;}/*** ViewHoler与数据绑定*/@Overridepublic void onBindViewHolder(Holder holder, String data, int position){TextView text = holder.get(R.id.text);text.setText(data);}
}
#原理
原理是什么呢?我们在adaptor内部就封装了一个List用于保存用户传过来的List数据,我们这里只是对外部的list有一个引用,但是真正使用到的list,却是内部的List,通过每一次调用notifyDataSetChanged()方法,则自动将内部的list数据与外部的list数据同步一次。再调用父类的更新、这样,我们玩来玩去就是外部的list,并不会对内部listview使用到的list有任何影响。就完美屏蔽了这个异常了。
#另外
分享一句我最喜欢的歌词: 如果那两个字没有颤抖 我不会发现我难受 怎么说出口也不会是分手
如果对于明天没有要求 牵牵手就像旅游(女友) 成千上万个门口 总有一个人要先走
怀抱既然不能逗留 何不在离开的时候 一边享受一边泪流
转载于:https://my.oschina.net/xiaolei123/blog/775268
自定义BaseAdapter完美解决ListView异常:java.lang.IllegalStateException相关推荐
- 解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错
解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错 问题描述: 笔者将一个在 Tomcat ...
- 针对异常java.lang.IllegalStateException onMeasure() did not set the measured dimension解决方法
针对异常java.lang.IllegalStateException onMeasure() did not set the measured dimension by calling setMea ...
- Tomcat启动之异常java.lang.IllegalStateException
Tomcat启动之异常java.lang.IllegalStateException 参考文章: (1)Tomcat启动之异常java.lang.IllegalStateException (2)ht ...
- 调用方法[manageApp]时发生异常 java.lang.IllegalStateException: 启动子级时出错
学习maven的初步阶段 在写第一个HelloServlet的servlet程序时,碰见了这样的错误: 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache. ...
- android java.lang.illegalstateexception,Android异常 java.lang.IllegalStateException解决方法
Android异常详情介绍 这种异常我遇到以下两种情况: 1. java.lang.IllegalStateException: No wrapped connection. 2.java.lang. ...
- spring异常java.lang.IllegalStateException
十月 26, 2017 11:23:24 下午 org.apache.coyote.AbstractProtocol init 信息: Initializing ProtocolHandler [&q ...
- 完美解决 ListView偶尔爆出的异常:java.lang.IllegalStateException
在我们Android 开发中,ListView是在常用不过的控件了.但是有时候会爆出这种异常,就搞得好尴尬了. 明明我们在代码中的确是有调用adaptor.notifyDataSetChanged() ...
- 完美解决SSM中 java.lang...c3p0/impl/NewProxyResultSet.isClosed()Z is abstract 【插入数据只能插入一条问题】
报错信息如下 解决办法 在pom.xml文件中修改我们引入的c3p0依赖的jar包: 之前是: <!--数据库连接池 驱动--><!-- https://mvnrepository. ...
- 常见的java异常——java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path...
此异常是由于你的controller中有两个名字与内容相同的方法: 出现此异常时去检查你的controller中是否有重复的名字的方法: 转载于:https://www.cnblogs.com/201 ...
最新文章
- C语言 之 PTA乙级错误集锦
- windows下mysql(解压版)安装教程
- 蓝桥杯单片机stc15f2k60s2 中断函数代码模板注释
- 设计模式之单例模式——Singleton
- java 判断object类型_Java多态的6大特性|乐字节
- mysql的dockerfile_dockerfile构建mysql镜像
- 提升SQL Server速度 整理索引碎片
- [转载] Python集合取交集intersection()函数和intersection_update()函数
- hive map 转string_Hive之SELECT语句的实用技巧 (一) | 每日五分钟学大数据
- 三星note升级android9,三星Note9官方台版安卓9固件rom升级更新包:BRI-N960FXXS3CSI5
- VBA 代码如何跟随Excel保存
- 杂项-公司:Apple
- java Ofd 转图片_一文教你搞懂如何将ofd格式的文件转为图片
- 如何给div加遮罩?
- Network (哈工大网课笔记)
- 易飞软件乱码显示不正常
- Rust GUI 编程漫谈:超越 Web 与原生 GUI
- 交互设计师的这些能力你都具备了吗
- Python_Python网络编程
- Qt for python 的属性系统使用,并注册python到qml使用
热门文章
- 云计算和java开发哪个好找工作前景好,深入分析
- 超长距离超大容量波分传输应用
- Windows 7 with SP1各版本下载
- Xilium.CefGlue关闭进程卡住,崩溃的问题
- Spring Boot进阶(40):实现文件批量导出到zip压缩包并本地下载 | 超级详细,建议收藏
- 中科灵芝孢子油抗癌机理
- 强大好用的python绘图
- 如何在MSTAR SAR图像目标识别数据集中刷出99.5%的准确率?
- 统计学第八版贾俊平第八章课后习题答案
- 【LM】(八)语言模型评价指标——困惑度Perplexity原理及代码