关于notifyDataSetChanged()

来源:互联网 发布:菲尔杰克逊 知乎 编辑:程序博客网 时间:2024/05/18 15:53
在一个碎片当中增加一个方法,用来通知ArrayAdapter对象adpater数据发生了改变
public class AssignFragmentAll extends Fragment{
    
    //......


    /**
     * data changed */
    public void notifyDataSetChanged(){
        adapter.onDataSetChanged();
        adapter.notifyDataSetChanged();
    }
}
可以看到这里,先调用adpater里面的自定义方法,然后通知数据发生了改变。
这里的自定义方法的内容是什么呢?
它是这样定义的:
    /**
     * 更新adapter信息 */
    public void onDataSetChanged(){
        //添加新的项
        generateDataset(true);
    }
这里的generateDataset传入一个boolean参数,用于指示产生数据集合之前是否应该先
清除该集合内的全部数据
    /**
     * 产生数据集合
     * @param clear */
    public void generateDataset(boolean clear) {
        if (clear) clear();
        ....
    }
因为我们知道ArrayAdaper实际上是基于一个内部的ListView的,所以它包含了add() clear()等
方法,直接调用该方法即可。
但是这里我的数据集合并没有被清除。
经过短暂的查找之后才发现,数据被清除是在notifyDataSetChanged()之前调用的,所以
不会在界面上更新数据清除的结果。
又数据发生改变的相关的有两个方法,一个是
notifyDataSetChanged()
一个是
setNotifyOnChange(boolean notifyOnChange)
前面的方法要求每次更新、添加数据之后自己调用该方法通知adapter发生了变化,
后者只要传入boolearn为true,每次删除、增加数据之后会自动通知,即调用notifyDataSetChanged()
如果设置为false,则同样要自己调用notifyDataSetChanged()默认为true。


所以,每次添加、删除数据的时候就会自动调用notifyDataSetChanged()方法,根本无需添加该方法。
而ListView包含了一个Adaper也无法使用removeAllViews大方法,那么问题出在了哪里呢?
让我啼笑皆非的是,问题不在ListView和adaper当中,因为我在generateDataset时使用了一个
ArrayList来临时存储数据,每次清除的时候只调用了adaper的clear,忘记了调用它的clear方法了,因此每次修改都无效。


好了,一个Little Problem竟然耗费了那么长的时间来解决,不过,这个过程肯定是能够学习到一些东西的,
比如,上面的这些关于Adapaer的知识。也把该错误记录在这里,希望自己以后不要犯类似错误。
0 0