惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
V
V2EX
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
A
About on SuperTechFans
博客园_首页
L
LangChain Blog
量子位
雷峰网
雷峰网
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
M
MIT News - Artificial intelligence
N
Netflix TechBlog - Medium

博客园 - Class Xman

手动建库时一个小错误:ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance Windows下USB磁盘开发系列二:枚举系统中所有USB设备 Clouda聊天室实践 ASP.NET Repeater嵌套Repeater实现菜单加载 浅说正则——会了就不会忘 hdu2068RPG的错排 用实例讲解RSA加密算法(精) ARM——操作系统—最小操作系统-开发板测试 HTML入门教程 HDU 4770 Lights Against DudelyLights (顺序表的应用5.4.3)POJ 1012(约瑟夫环问题——保证前k个出队元素为后k个元素) Android 程序崩溃后的处理 IE7 float:left失效的解决方法 android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据 如何避免来自企业内部的网络安全威胁(二) Android安装失败 Installation error code: -110 Android TextWatcher监控EditText中的输入内容并限制其输入字符个数 不让自己的应用程序在桌面的图标列表里启动显示的方法 Fragment与FragmentAcitvity间的传值
android开发中难免遇到listview刷新数据出现异常
Class Xman · 2013-11-14 · via 博客园 - Class Xman

异常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();
    }

就这几步。

写代码时,认真检查代码逻辑。