因为刚接触Android,今天在项目中使用listView时出现了一个无法通过适配器notifyDataSetChanged刷新的问题,项目大概功能是首先从接口中获取一组数据在listView中显示,然后在进行某一系列操作后。又需要重新从接口获取数据然后展示在listView中。大概功能就是这样,下面我写了一个简单的Demo。数据功能的形式也大概是这样

       List list = new String[]{"listView item"};       ArrayAdapter adapter= new ArrayAdapter(this,android.R.layout.simple_list_item_1,list);       listView.setAdapter(adapter);       list = new String[]{"new listView item"};       adapter.notifyDataSetChanged();

     我相信大家也都能看懂上面的逻辑,我就不说明了。然后之前我一般都是使用的add()来添加数据然后notifyDataSetChanged来进行刷新。所以也没去关注源码,后来看了adapter相关的源码如下图

           

     由此我们可以得知这个notifyDataSetChanged的时候它创建了一个数组,所以说adapter监听的是它之前传入的数组的变化也就是new String[]{"listView1 item"},而不是list。之前我一直以为是监听的list变化,换一种说法也就是adapter本身会保存一个对原始数据源(new String[]{"listView1 item"})的内部引用mObservers然后对它进行监听并刷新,上面Demo中我是重新new的一个list集合,所以无法使用notifyDataSetChanged来进行刷新。list = new String[]{"new listView1 item"};这相当于切断了list与原始数据源(new String[]{"listView item"};)的关系,因此之后调用notifyDataSetChanged并不会起作用,因为list 和mObservers已经是存在于堆上的完全不同的两个list集合了

  

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android之高仿微信聊天的界面
  5. 网易HubbleData之Android无埋点实践
  6. Android(安卓)轻量级缓存框架ASimpleCache分析
  7. android Activity之间数据传递 Parcelable和Serializable接口的
  8. 杂乱之android的Gallery图像展示应用
  9. android 数据库之Cursor

随机推荐

  1. android 中getBaseContext getApplicatio
  2. Android(安卓)ListView item 焦点被抢无
  3. Mac OS启动 Android(安卓)Device Monitor
  4. Android中Java服务过程
  5. Android(安卓)4.0以后正确的获取外部sd卡
  6. android传送照片到FTP服务器的实现代码
  7. Android(安卓)InterFilter的匹配规则
  8. Android实现短信验证码自动填写功能
  9. android默认关闭Location服务及关闭锁屏
  10. Android开机自启动程序详解