Android开发——ListView局部刷新的实现
来源:互联网 发布:linux关闭oracle服务 编辑:程序博客网 时间:2024/06/11 12:23
0. 前言
局部刷新,即只需要在数据发生变化时才去刷新ListView中对应的Item,数据未发生变化时不会去刷新ListView中对应的Item。对于getView()非常耗时的情况下将体现出极大的性能优化。局部刷新的功能早已经被集成在了RecycleView中,而且RecycleView还引入了增加和删除的动态效果等等,在性能上和定制上都有很大的改善。本篇着重介绍ListView中局部刷新的实现。
1. 结合Adapter的hasStableIds()以及getItemId()
局部刷新的实质是找到那些数据发生改变Item,并且重新调用它的一次getView()方法。
那么如何才能让Adapter知道哪些Item的数据发生了变化呢?Stack OverFlow上有人提出了以下方案:
//If hasStableIds() returns false then each time you call notifyDataSetChanged() your Adapter will look at the returned//value of getItemId and will eventually call getView(int position, View convertView, ViewGroup parent) only for those //items which id has changed.Using this technique you can update only one Item in the ListView.
设置Adapter的hasStableIds()返回false,代表子元素持有不稳定的ID。如果hasStableIds()返回了false,每次调用notifyDataSetChanged()方法adapter就会判断getItemId()方法的返回值,如果该返回值发生了变化,即某个Item发生了变化,那么就只调用发生变化的那些Item的getView()方法,从而达到局部刷新的效果。
举例如下:如果你有一个List的元素,Bean文件如下:
class Data{ String myUrl; String myContent;}
你需要在getItemId()方法中这样写:
@Overridepublic long getItemId(int position){ Data data = mList.get(position); return (data. myUrl + data. myContent).hashcode();}
因为我们平时在写getItemId()方法的时候直接返回了position,这里我们让getItemId()的返回值不依赖于位置,而是依赖于这个位置上数据的实时信息,如果这个位置上的数据发生了变化(即List.get(position)处的数据发生了改变),再调用notifyDataSetChanged()时,Adapter会检测到该位置的ID发生了变化,就会重新调用该位置Item的getView()方法,从而达到局部刷新的效果。
2. 直接找到指定位置的holder
private void updateItem(int position) { View view = mListview.getChildAt(position); MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder)view.getTag(); holder.textView.setText("This is new"); //记得更新list数据源中position位置的数据,避免滑动后局部刷新失效}
以上方式是比较常规的,即根据position位置找到对应子View的holder,直接根据业务需求修改holder中的数据即可。当然,记得更新list数据源中position位置的数据,否则来回滑动后局部刷新会失效。
- Android开发——ListView局部刷新的实现
- Android开发之ListView实现Item局部刷新
- Android开发---ListView实现局部刷新及删除
- android:ListView的局部刷新
- 【android】ListView的局部刷新
- android:ListView的局部刷新
- Android ListView的局部刷新
- Android奇巧:ListView实现Item局部刷新
- Android ListView 局部刷新
- Android ListView局部刷新
- android listview 局部刷新
- Android ListView局部刷新
- Android listview局部刷新
- listview的局部刷新
- ListView的局部刷新
- ListView的局部刷新
- listview的局部刷新
- ListView的局部刷新
- Qt分割窗口QSplitter类
- lua table打印
- csharp 003引用类型及string下面常用方法
- JavaScript函数绑定Demo以及函数Currying柯里化
- 学习Javascript闭包(Closure)
- Android开发——ListView局部刷新的实现
- javaSE_07Java中类和对象-封装特性--练习
- 基于贪心算法的区间问题
- 快速排序
- SplayTree--BZOJ1500
- malloc(0)会发生什么?
- JMeter自动生成测试Report
- 图像边缘检测、角点特征检测——2017.4.1
- 算法学习笔记--背包、队列、栈(1)