博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发——ListView局部刷新的实现
阅读量:4044 次
发布时间:2019-05-24

本文共 1709 字,大约阅读时间需要 5 分钟。

0. 前言  

局部刷新,即只需要在数据发生变化时才去刷新ListView中对应的Item,数据未发生变化时不会去刷新ListView中对应的Item。对于getView()非常耗时的情况下将体现出极大的性能优化。局部刷新的功能早已经被集成在了RecycleView中,而且RecycleView还引入了增加和删除的动态效果等等,在性能上和定制上都有很大的改善。本篇着重介绍ListView中局部刷新的实现。

 

1.  结合AdapterhasStableIds()以及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.

设置AdapterhasStableIds()返回false,代表子元素持有不稳定的ID。如果hasStableIds()返回了false,每次调用notifyDataSetChanged()方法adapter就会判断getItemId()方法的返回值,如果该返回值发生了变化,即某个Item发生了变化,那么就只调用发生变化的那些ItemgetView()方法,从而达到局部刷新的效果。

举例如下:如果你有一个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发生了变化,就会重新调用该位置ItemgetView()方法,从而达到局部刷新的效果。

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位置找到对应子Viewholder,直接根据业务需求修改holder中的数据即可。当然,记得更新list数据源中position位置的数据,否则来回滑动后局部刷新会失效。

转载地址:http://mkzci.baihongyu.com/

你可能感兴趣的文章
3 张图搞懂 HBase 的存储原理.md
查看>>
一篇文章搞懂 HBase 的 flush 机制和 compact 机制
查看>>
一篇文章搞懂 HBase 的 region 拆分机制
查看>>
HBase 表的预分区是什么?为什么要预分区?如何预分区?
查看>>
Flume 是什么?Flume 有什么特点?
查看>>
一篇文章搞懂 Flume 的架构设计
查看>>
Flume 是怎么保障可靠性的?
查看>>
Flume 怎样实现数据的断点续传?
查看>>
Flume 如何自定义 Mysql Source?
查看>>
Flume 如何自定义 Mysql Sink?
查看>>
Flume 的可靠性级别有哪些?
查看>>
Sqoop 是什么?Sqoop 有什么特点?
查看>>
Sqoop 的使用场景分析
查看>>
DAGScheduler 是什么?有什么作用?
查看>>
DAGScheduler 是如何划分 Stage 的?
查看>>
TaskScheduler 是什么?有什么作用?
查看>>
一篇文章搞懂 DAGScheduler 的调度流程
查看>>
SparkEnv 是什么?有什么作用?
查看>>
SparkConf 是什么?有什么作用?
查看>>
SecurityManager 是什么?有什么作用?
查看>>