浅谈Android中适配器的notifyDataSetChanged()为何有时不刷新

 更新时间:2020年07月24日 08:40:53   作者:bddylww  
这篇文章主要介绍了浅谈Android中适配器的notifyDataSetChanged()为何有时不刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

学过Android开发的人都知道,ListView控件在开发中经常遇到,并且ListView通常结合Adapter适配器来进行数据显示和数据更新操作。姑且假设数据存储在名为dataList的成员变量中。数据操作无非是增加数据、删除数据这两种主要的操作,而当数据有所变化时,为了及时向用户提供更新后的数据,我们知道需要在数据更新后调用适配器的notifyDataSetChanged()方法,来显示更新后的数据。殊不知,该方法并非百试不爽,在此我们便来讨论下具体的原因,其实本质是关注内存的分配情况。 先来看几段代码。

代码段1(某Activity中):

private List<Map<String,String>> dataList;
private ListView listView;
private ListAdapter adapter;

listView = findViewById(R.id.mancard);
adapter = new ListAdapter(this, dataList);
listView.setAdapter(adapter);

上述代码是把Adapter适配器和ListView控件进行绑定。

代码段2(ListAdapter中的部分代码):

public class ListAdapter extends BaseAdapter{
private Context context;
private List<ArrayList> list;

ListAdapter(Context context, List list){
    this.context = context;
    this.list = list;
}
@Override
public Object getItem(int position) {
    return list.get(position);
}

上述代码是通过上下文环境和数据列表来构造适配器,并且重写其getItem()方法。在此需要明白的是list成员变量是适配器中的私有变量,getItem()方法是当数据显示在ListView时会回调的方法,或者说当显示数据或数据发生改变重写加载数据时会回调这个方法(当然还会调用getView()方法,此时不再赘述)。 代码段3~6模拟数据改变: 代码段3

dataList.remove(1);
adapter.notifyDataSetChanged();

代码段4:

Map vivian = new HashMap();
vivian.put("sex", "girl");
vivian.put("nick", "vivian");
vivian.put("content", "阳光魅力大方无极限");
dataList.add(vivian);
adapter.notifyDataSetChanged();

代码段5:

dataList = getData();
adapter.notifyDataSetChanged();

private List getData(){
    List data = new ArrayList();
    Map vivian = new HashMap();
    vivian.put("sex", "girl");
    vivian.put("nick", "vivian");
    vivian.put("content", "阳光魅力大方无极限");
    data.add(vivian);

    Map Mryang = new HashMap();
    Mryang.put("sex", "boy");
    Mryang.put("nick", "杨阳洋");
    Mryang.put("content", "成熟稳重高富帅");
    data.add(Mryang);

    return data;
}

代码段6:

dataList = getData();
adapter.notifyDataSetChanged();

private List getData(){
    List data = new ArrayList();
    Map vivian = new HashMap();
    vivian.put("sex", "girl");
    vivian.put("nick", "vivian");
    vivian.put("content", "阳光魅力大方无极限");
    data.add(vivian);

    Map Mryang = new HashMap();
    Mryang.put("sex", "boy");
    Mryang.put("nick", "杨阳洋");
    Mryang.put("content", "成熟稳重高富帅");
    data.add(Mryang);

    return data;
}

getData()方法同代码段5(略)

以上几种情况模拟了常用的更新数据的方法,在这几种情况种代码段5不能实现数据的更新操作,代码段3、4、6可以实现数据更新操作。为什么代码段3、4、6可以更新,原因大家都明白,是因为数据发生了变化,因此当调用adapter.notifyDataSetChanged()方法时就会把更新后的数据显示出来。
代码段5的数据也发生了变化,为什么不能实现数据更新呢?
当构造Adapter适配器,数据列表dataList传递过去时,是把dataList指向的地址副本作为参数传递给了adapter中的list成员变量了,因此dataList指向的内存区域和adapter中list指向的内存区域是同一块内存区域,代码段3和代码段4对数据的添加、删除操作是在当前区域内进行的,dataList中数据的变化直接影响了adapter中list的数据的变化,因此adapter中的list能够敏感的发现数据发生变化。

代码段3、4简易模型 代码段5中,对dataList的内存指向做了修改,但是该指向并没有通知到adapter中的list,也就是说list指向没有发生变化,还是指向原来修改前的内存区域,因此dataList的改变并不能引起list的改变,本质上来说list没有发现数据有变化,所以当调用adapter.notifyDataSetChanged()方法时,数据没有更新。而在代码段6中,首先移除dataList中的数据,那么adapter中的list自然能够及时发现数据发生了变化,从而重新从dataList中得到改变后的数据信息,因此当调用adapter.notifyDataSetChanged()方法时能够发生数据的更新。

代码段5简易模型

代码段6简易模型 因此当我们想要更换ListView中的所有数据时,应该采用代码段6的方式,先将数据移除,再重新添加数据或更换新的内存区域指向。

到此这篇关于浅谈Android中适配器的notifyDataSetChanged()为何有时不刷新的文章就介绍到这了,更多相关Android 适配器 notifyDataSetChanged()不刷新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android SQLite详解及示例代码

    Android SQLite详解及示例代码

    本文主要讲解Android SQLite,这里对数据库SQLite 做了详细的知识资料整理,并附示例代码和实现效果图,有需要的小伙伴可以参考下
    2016-08-08
  • 解析android创建快捷方式会启动两个应用的问题

    解析android创建快捷方式会启动两个应用的问题

    本篇文章是对关于android创建快捷方式会启动两个应用的问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Android apk完整性检测的实现思路和代码实现

    Android apk完整性检测的实现思路和代码实现

    这篇文章主要介绍了Android apk完整性检测的实现思路和代码实现,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • Android显式启动与隐式启动Activity的区别介绍

    Android显式启动与隐式启动Activity的区别介绍

    为什么要写显式启动与隐式启动Activity,Android的Acitivity启动大致有两种方式:显式启动与隐式启动,下面分别介绍
    2014-09-09
  • Android7.0中关于ContentProvider组件详解

    Android7.0中关于ContentProvider组件详解

    本文描述了Android7.0中关于ContentProvider组件实现原理以及ContentProvider发布者和调用者这两在Framework层是如何实现的。
    2017-11-11
  • android gradle如何修改生成的apk名字

    android gradle如何修改生成的apk名字

    Gradle是当前非常“劲爆”得构建工具,而这篇文章主要给大家介绍了关于android gradle如何修改生成的apk名字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Android实现简单卡片布局

    Android实现简单卡片布局

    这篇文章主要为大家详细介绍了Android实现卡片布局的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Android 图片网格布局控件示例代码

    Android 图片网格布局控件示例代码

    本篇文章主要介绍了Android 图片网格布局控件示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Android面试题问答整理

    Android面试题问答整理

    今天小编就为大家分享一篇关于Android面试题问答整理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Android自定义view之利用drawArc方法实现动态效果(思路详解)

    Android自定义view之利用drawArc方法实现动态效果(思路详解)

    这篇文章主要介绍了Android自定义view之利用drawArc方法实现动态效果,drawArc方法包含了五个参数,具体细节在本文中给大家提到过,需要的朋友可以参考下
    2021-08-08

最新评论