在一个碎片当中增加一个方法,用来通知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的知识。也把该错误记录在这里,希望自己以后不要犯类似错误。
关于 notifyDataSetChanged()
最新推荐文章于 2018-10-28 19:34:29 发布