使用自定义Adapter后 ListView刷新问题

来源:互联网 发布:网络高清机顶盒哪个好 编辑:程序博客网 时间:2024/06/05 11:30
我是使用自己写的adapter,除了数据更新还需要用checkbox记录每次点击itme位置,点击的是哪一条信息,刷新完页面后之前点击的数据也要做记录,当返回来的时候还能看到之前点击的那一条数据(注意这里说记录的是每个页面上的数据,而不是记录上次点击的位子,如果记录的是位置,然后每次刷新在相同的位置数据都会记录上),还有一点数据是包含关系,每次页面刷新也是从之前数据中筛选出的。

首先我们先看SimpleAdapter中继承自BaseAdapter的两个方法:

1、public void notifyDataSetInvalidated ()
Open Declaration void android.widget.BaseAdapter.notifyDataSetInvalidated()

Notifies the attached observers that the underlying data is no longer valid or available. Once invoked this adapter is no longer valid and should not report further data set changes.

该方法内部实现了在每个观察者上面调用onInvalidated事件。每当发现数据集监控有改变的情况,比如该数据集不再有效,就会调用此方法。
2、public void notifyDataSetChanged ()
Open Declaration void android.widget.BaseAdapter.notifyDataSetChanged()

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

该方法内部实现了在每个观察者上面调用onChanged事件。每当发现数据集有改变的情况,或者读取到数据的新状态时,就会调用此方法。

notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。

notifyDataSetInvalidated(),会重绘控件(还原到初始状态)
notifyDataSetChanged(),重绘当前可见区域


看完后还是不太明白两个刷新区别到底在哪,所说的数据源无效,到底是在什么情况下之前得数据源算是无效??

然后经过测试得出每次listview.setAdapter(myAdapter);后说明数据源是重新生成如果之前已经set过,那就是之前的数据源已经无效。

测试结果是:

1、初始化listview后通过选择设定好的条件,这时候是没有重新setadapter,更新当前的listview使用notifyDataSetChanged(),结果是页面元素改变;

2、初始化listview后通过选择设定好的条件,这时候是没有重新setadapter,更新当前的listview使用notifyDataSetInvalidated(),结果是页面元素改变;

3、初始化listview后通过选择设定好的条件,这时候重新setadapter,更新当前的listview使用notifyDataSetChanged(),结果是页面元素改变;

4、初始化listview后通过选择设定好的条件,这时候重新setadapter,更新当前的listview使用notifyDataSetInvalidated(),结果是页面元素改变;


测试完后发现几个都可以刷新。。。。。

但是。。。。我是使用自己写的adapter,除了数据更新还需要用checkbox记录每次点击itme位置,点击的是哪一条信息,刷新完页面后之前点击的数据也要做记录,当返回来的时候还能看到之前点击的那一条数据(注意这里说记录的是每个页面上的数据,而不是记录上次点击的位子,如果记录的是位置,然后每次刷新后在相同的位置数据都会记录上)

又把以上方法重新测试一遍:

1、初始化listview后通过选择设定好的条件,这时候是没有重新setadapter,更新当前的listview使用notifyDataSetChanged(),结果是页面元素改变;但是数据记录不对应,每次刷新页面在相同位置都会有记录,也就是说自定义Adapter里边有些数据改变了,但是没有更新。然后修改再测试

2、初始化listview后通过选择设定好的条件,这时候重新setadapter,更新当前的listview使用notifyDataSetChanged(),结果是页面元素改变;结果同上

3、初始化listview后通过选择设定好的条件,这时候是没有重新setadapter,更新当前的listview使用notifyDataSetInvalidated(),结果是页面元素改变;结果同上。

4、初始化listview后通过选择设定好的条件,这时候重新setadapter,更新当前的listview使用notifyDataSetInvalidated(),结果是页面元素改变;OK那条数据被点击过记录下来了。


那他们是怎么通知页面刷新和记录被点击数据呢??敬请期待。。。

0 0