android开发中难免遇到listview刷新数据出现异常
异常: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.
解决办法分析:
既然与listView绑定了的list发生了变化而没来得及通知listView导致了上述的异常,那我们就针对这一点,只要listView与list绑定后,在listView显示之前不要让list发现变化就行了。做法有很多种,我个人的做法是这样子的:
首先,定义一个独立的List:
private List<Map<String,Object>> data = null;
接着,在onCreate中初始化它(当然,你也可以在每次用到它的时候初始化它,不过这样子会初始化很多歌对象,浪费内存,不推荐):
data = new ArrayList<Map<String,Object>>();
然后,在创建adapter之前,把list中数据放入到集合data中,注意千万不要直接赋值:data = list(这是错误的,因为这样data也指向了list所在的内存地址,即data跟list是同一个对象,list改变的话data也跟着改变);应该这么做:
data.clear();//要先清空data中的数据,避免把list中的数据重复放入data中。
data.addAll(list);//这样做,list中的数据就放入到data中,之后list在后台线程中改变,但data不会改变,这时,你再
SimpleAdapter adapter = new SimpleAdapter(LocalActivity.this,data,R.layout.local_music_list,new String[] {"local_name","local_size"}, new int[]{R.id.local_name,R.id.local_size});
listView与data绑定,就不会发生上述异常了!
几句重要源码:
1、第一步代码:
private void initData() {
storeInfoList = new ArrayList<StoreSimpleInfoEntity>(); // 实例化对象
sendRequestGetNearShop(flag, firstPage); // 异步请求数据
myAdapter = new StoreInfoAdapter3(NearByStoreActivity.this,storeInfoList); // 初始化适配器
curNewStoreList.setAdapter(myAdapter);
curNewStoreList.setPullLoadEnable(true);
curNewStoreList.setXListViewListener(this);
curNewStoreList.setOnItemClickListener(this);
}
2、第二步代码:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS:
storeInfoList.addAll(storeInfo); // 数据成功返回后将返回数据添加到定义好的storeInfoList中
refreshAdapter(storeInfoList);
onLoad();
break;
case FAIL:
break;
case CLOSE:
break;
}
};
};
3、第三步代码:
/**
*
* @Title: refreshAdapter
* @Description:刷新myAdapter适配器
* @param
* @return
* @exception
* 2013-11-14 下午3:40:13
*/
private void refreshAdapter(final List<StoreSimpleInfoEntity> items) {
runOnUiThread(new Runnable() {
public void run() {
myAdapter.refreshAdapter(items);
}
});
}
4、第四步:
适配器中的代码:
/*
* 提供适配器刷新方法
*/
public synchronized void refreshAdapter(List<StoreSimpleInfoEntity> items) {
list = items;
notifyDataSetChanged();
}
就这几步。
写代码时,认真检查代码逻辑。
android开发中难免遇到listview刷新数据出现异常的更多相关文章
- Android开发中常用的ListView列表的优化方式ViewHolder
在Android开发中难免会遇到大量的数据加载到ListView中进行显示, 然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需 求变化ListView'条目中的内容是越来越多这就 ...
- android开发中的5种存储数据方式
数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...
- android开发中 解决服务器端解析MySql数据时中文显示乱码的情况
首先,还是确认自己MySql账户和密码 1.示例 账户:root 密码:123456 有三个字段 分别是_id .username(插入有中文数据).password 1)首先我们知道 ...
- Android开发中Bundle用法包裹数据(转)
Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...
- Android开发之自定义的ListView(UITableViewController)
Android开发中的ListView, 顾名方法思义,就是表视图.表示图在iOS开发中就是TableView.两者虽然名称不一样,但是其使用方法,使用场景以及该控件的功能都极为相似,都是用来展示大量 ...
- Android开发中,那些让您觉得相见恨晚的方法、类或接口
Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...
- Android开发中目前流行控件和知识点总结
Android开发中目前流行控件和知识点总结 1.SlidingMenu 滑动菜单 应用案例:Facebook . Path 2.0 .人人.网易新闻 下载地址: https://github.c ...
- Android开发中StackOverflowError
Android开发中StackOverflowError错误实例分析 一.概述 我在一个复杂的layout嵌套较多的android界面,碰到了java.lang.StackOverflowError这 ...
- 在 Android开发中,性能优化策略十分重要
在 Android开发中,性能优化策略十分重要本文主要讲解性能优化中的布局优化,希望你们会喜欢.目录 示意图 1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如 ...
随机推荐
- assert_option()可以用来对assert()进行一些约束和控制
一.evaleval用法:eval() 函数把字符串按照 PHP 代码来计算.该字符串必须是合法的 PHP 代码,且必须以分号结尾.如果没有在代码字符串中调用 return 语句,则返回 NULL.如 ...
- hibernate关联关系笔记
Hibernate关联关系笔记 单向N:1 * 有连接表:在N方使用<join>/<many-to-one>.1方无需配置与之关联的持久化类. * 没有连接表:在N方使用& ...
- js 打印
关于js打印很简单的一段代码 function doPrint() { var newWindow = window.open("打印窗口", "_blank" ...
- Theos 工程
一.tweak 工程 1.创建步骤 a) terminal cd 到想要存放项目的目录下 b) 按图步骤完成即可 二.工程文件描述 1.control 记录 deb 包管理系统所需的基本信息. 2.a ...
- 线程中调用python win32com
在python的线程中,调用win32com.client.Dispatch 调用windows下基于COM组件的应用接口, 需要在调用win32com.client.Dispatch前,调用pyth ...
- win7 WindowsImageBackup 无法识别
控制面板\所有控制面板项\备份和还原
- cloudera learning5:Hadoop集群高级配置
HDFS-NameNode Tuning: dfs.namenode.handler.count: NameNode可开启的thread number,thread为从NameNode到DataNod ...
- 后移动互联网时代:到底还要不要开发一个App?
后移动互联网时代,到底是什么样的一个时代? 首先,后移动互联网时代中,产生头部应用的几率变小了,像微信这样巨头式的App很难在产生第二个.其次,后移动互联网时代,物联网发展迅速,所有的智能硬件都需要一 ...
- 关于JSTL一些需要说明的
一直认为与.NET相比,JAVA最大的问题在于不统一,当然这可能是自由的代价,正如某某某一样,造成的结果是需要记各种各样的版本,有jsp的.servlet的.各种框架的.各种容器的,不一而足.今天要说 ...
- Node.js的特点
作为后端JavaScript的运行平台,Node保留了前端JavaScript中些熟悉的接口,没有改写语言本身的任何特性,依旧基于作用域和原型链,区别在于它将前端中广泛应用的思想作用到了服务器端.下面 ...