zoukankan      html  css  js  c++  java
  • 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();
        }

    就这几步。

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

  • 相关阅读:
    [原创]在Windows平台使用msvc(cl.exe) + vscode编写和调试C/C++代码
    几种动态调用js函数方案的性能比较
    z-index随笔
    [原]配置多个密钥免密码登录服务器简明教程
    [转]为 windows cmd 设置代理
    [原创]实现多层DIV叠加的js事件穿透
    [转]linux terminal中使用proxy
    [转]jquery中innerWidth(),outerWidth(),outerWidth(true)和width()的区别
    [转]React表单无法输入原因----约束性和非约束性组件
    [原创]aaencode等类似js加密方案破解方法
  • 原文地址:https://www.cnblogs.com/james1207/p/3424245.html
Copyright © 2011-2022 走看看