ray*_*bay 6 android listview android-adapter
如果我有ListView一个CustomAdapter让我们说我有这个refresh()方法刷新,新的结果列表中,我应该:
呼叫new CustomAdapter(...)初始化时,每次我打电话时refresh(),我用adapter.clear()和adapter.add(...)
new CustomAdapter(...)每次打电话都打电话refresh()
基本上,我问,每次加载新结果时重新创建适配器是否更好,或者更好地清除现有适配器中的结果并将整个列表添加到其中?
notifyDataSetChanged()调用原始适配器肯定比设置新适配器更好。
原因是性能:ListView使用视图回收来避免在滚动时创建新的项目视图。当您设置新的适配器时,这些回收的视图将被丢弃,这意味着必须从头开始重新创建它们以用于下一个布局过程。看看下面的代码ListView.setAdapter():
@Override
public void setAdapter(ListAdapter adapter) {
if (mAdapter != null && mDataSetObserver != null) {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
resetList();
mRecycler.clear();
...
Run Code Online (Sandbox Code Playgroud)
这是完全合乎逻辑的行为,因为ListView假设新适配器将使用的视图与前一个适配器返回的视图不兼容(无论如何,它不能假设它们将兼容)。所以他们被扔掉了。
因此,如果每次都设置新的适配器,则会产生不必要的性能成本(重新创建所有当前视图)。
另外,如果您编写了自定义适配器,则不一定需要add()单独调用(例如,ArrayAdapter)。您只需将内部数据收集替换为新的,然后notifyDataSetChanged()再调用即可。
| 归档时间: |
|
| 查看次数: |
2418 次 |
| 最近记录: |