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相关推荐

  1. 解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错

    解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错 问题描述:   笔者将一个在 Tomcat ...

  2. 针对异常java.lang.IllegalStateException onMeasure() did not set the measured dimension解决方法

    针对异常java.lang.IllegalStateException onMeasure() did not set the measured dimension by calling setMea ...

  3. Tomcat启动之异常java.lang.IllegalStateException

    Tomcat启动之异常java.lang.IllegalStateException 参考文章: (1)Tomcat启动之异常java.lang.IllegalStateException (2)ht ...

  4. 调用方法[manageApp]时发生异常 java.lang.IllegalStateException: 启动子级时出错

    学习maven的初步阶段 在写第一个HelloServlet的servlet程序时,碰见了这样的错误: 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache. ...

  5. android java.lang.illegalstateexception,Android异常 java.lang.IllegalStateException解决方法

    Android异常详情介绍 这种异常我遇到以下两种情况: 1. java.lang.IllegalStateException: No wrapped connection. 2.java.lang. ...

  6. spring异常java.lang.IllegalStateException

    十月 26, 2017 11:23:24 下午 org.apache.coyote.AbstractProtocol init 信息: Initializing ProtocolHandler [&q ...

  7. 完美解决 ListView偶尔爆出的异常:java.lang.IllegalStateException

    在我们Android 开发中,ListView是在常用不过的控件了.但是有时候会爆出这种异常,就搞得好尴尬了. 明明我们在代码中的确是有调用adaptor.notifyDataSetChanged() ...

  8. 完美解决SSM中 java.lang...c3p0/impl/NewProxyResultSet.isClosed()Z is abstract 【插入数据只能插入一条问题】

    报错信息如下 解决办法 在pom.xml文件中修改我们引入的c3p0依赖的jar包: 之前是: <!--数据库连接池 驱动--><!-- https://mvnrepository. ...

  9. 常见的java异常——java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path...

    此异常是由于你的controller中有两个名字与内容相同的方法: 出现此异常时去检查你的controller中是否有重复的名字的方法: 转载于:https://www.cnblogs.com/201 ...

最新文章

  1. C语言 之 PTA乙级错误集锦
  2. windows下mysql(解压版)安装教程
  3. 蓝桥杯单片机stc15f2k60s2 中断函数代码模板注释
  4. 设计模式之单例模式——Singleton
  5. java 判断object类型_Java多态的6大特性|乐字节
  6. mysql的dockerfile_dockerfile构建mysql镜像
  7. 提升SQL Server速度 整理索引碎片
  8. [转载] Python集合取交集intersection()函数和intersection_update()函数
  9. hive map 转string_Hive之SELECT语句的实用技巧 (一) | 每日五分钟学大数据
  10. 三星note升级android9,三星Note9官方台版安卓9固件rom升级更新包:BRI-N960FXXS3CSI5
  11. VBA 代码如何跟随Excel保存
  12. 杂项-公司:Apple
  13. java Ofd 转图片_一文教你搞懂如何将ofd格式的文件转为图片
  14. 如何给div加遮罩?
  15. Network (哈工大网课笔记)
  16. 易飞软件乱码显示不正常
  17. Rust GUI 编程漫谈:超越 Web 与原生 GUI
  18. 交互设计师的这些能力你都具备了吗
  19. Python_Python网络编程
  20. Qt for python 的属性系统使用,并注册python到qml使用

热门文章

  1. 云计算和java开发哪个好找工作前景好,深入分析
  2. 超长距离超大容量波分传输应用
  3. Windows 7 with SP1各版本下载
  4. Xilium.CefGlue关闭进程卡住,崩溃的问题
  5. Spring Boot进阶(40):实现文件批量导出到zip压缩包并本地下载 | 超级详细,建议收藏
  6. 中科灵芝孢子油抗癌机理
  7. 强大好用的python绘图
  8. 如何在MSTAR SAR图像目标识别数据集中刷出99.5%的准确率?
  9. 统计学第八版贾俊平第八章课后习题答案
  10. 【LM】(八)语言模型评价指标——困惑度Perplexity原理及代码