• ListView的动态刷新问题——用notifyDataSetChanged没作用


    或许非常多开发的朋友。尤其是Android刚開始学习的人,在动态刷新ListView时。使用notifyDataSetChanged并没有起到作用。

    有时会被困扰得非常痛苦。

    事实上,在使用notifyDataSetChanged过程中,还是有细节须要注意的。举个样例:

    我的ListView使用的数据源是来自ArrayList。

    通常我们的做法是创建一个已经有我们想要提供给ListView的数据的ArrayList,比如:

    ArrayList<Integer> list  = new ArrayList<Interger>;
    list.add(1);
    这里我们的list已经是指向了一个堆内存上了。

    接着我们想要改变list中的数据,而这个时候。就须要注意了,举个样例:我们在代码中有另外一个ArrayList叫做newlist,它是使用以下代码创建出来的:

    ArrayList<Integer> newlist  = new ArrayList<Interger>;
    list.add(2);

    这个时候,newlist指向的是一个和list指向不同的堆内存,这个时候。我们直接用list = newlist来把newlist的数据交给list,在这里,实际上仅仅是把list的指向改变了。让它也指向newlist指向的那个内存。

    那么这个时候我们再调用notifyDataSetChanged这种方法来通知listview更新数据就起不了不论什么作用了。原因非常easy,就是list的指向已经改变。而调用notifyDataSetChanged会去检查原来list指向的数据是否变化。可是这时的list已经不是原来的list了。所以它无法推断。仅仅能不作出响应了。那么。这个问题的解决方法是直接在原来的list上面更改数据,能够使用以下的代码来操作:

    list.clear();
    list.addAll(newlist);
    adapter.notifyDataSetChanged();
    
    这样。list的指向就不会改变,它还是指向原来那块内存。这样调用notifyDataSetChanged()就能够起作用了。

    总结:在这里的重点就是要注意在開始时传给ListView的list指向不能被改变。须要从始至终指向同一个内存。这样调用notifyDataSetChanged后就行检測到list的数据变化,从而触发ListView的又一次绘制了!

  • 相关阅读:
    [转]汇编语言的准备知识给初次接触汇编者 4
    Javascript实现页面跳转的几种方式收藏
    [转]汇编语言的准备知识给初次接触汇编者 1
    jQuery常用的函数的简单描述 便于查阅
    解决win7光驱驱动找不到的问题
    tar
    liunx64运行飞信的问题
    centos6禁用ipv6
    仍然是yum问题rhel6使用centos的yum源
    【MyBatis】使用MyBatis的分页组件PageHelper时,多表关联下使用别名查询时,前台传参过来,根据参数排序的解决方案
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6991451.html
Copyright © 2020-2023  润新知