Android开发——ListView局部刷新的实现
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()方法中这样写:
@Override
public 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 局部刷新
今天,简单讲讲android如何对ListView 进行局部刷新. 之前,自己做的ListView 发现刷新频率太高了,而且很多界面上看不到的数据改变时调用Adapter.notifyDataSetC ...
- android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题
今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...
- ListView 局部刷新
概述 在使用ListView的时候,我们都会对列表数据进行更新,当数据变化时,我们会调用adapter的notifyDataSetChange方法去刷新列表.但是,该刷新方法是使整个列表都更新一遍(调 ...
- android listview 数据同步,android中ListView数据刷新时的同步方法
本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...
- Flutter ListView 局部刷新数据、ListView点赞收藏
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. Flutter是谷歌推出的最新的移动开发框架. [x1]微信公众号的每日提醒 随时随记 每日积累 随心而过 [x2]各种系列的视频教程 ...
- android开发 listview 头部 轮播,listview添加的头部布局超过一屏头部内容显示不全...
headView的实际高度超过一个屏幕,但是显示的结果只有一个屏幕,超过一个屏幕高度意外的部分显示不全. 只使用了listView.getRefreshable().addHeadView(headV ...
- android 自定义view局部刷新,Android 优化之局部刷新
RecyclerView 局部刷新 相信现在已经很少人不用 RecyclerView 了,如果只有一个 item 的数据源改变的时候,大家都会用 notifyItemChanged(int posit ...
- FineReport——JS二次开发(局部刷新)
在FR中,可以通过在form表单设置多个报表模板,然后通过对某一模板刷新实现局部刷新的功能,在cpt模板中,由于只存在一个模板,所以无法实现局部刷新. 其实,最好的局部刷新办法是自定义一个页面,然后添 ...
- Android ListView局部刷新item
当前ListView页面跳转到其他页面返回后,重新获取数据后刷新局部item 1.首先需要获取到跳转之前item的位置,给ListView设置setOnScrollViewListener()接口,在 ...
- android开发--ListView中的getView原理
其实这里的复用技术在列表中是十分常见的,iphone中的tableView也有相关的技术,cell的复用 工作原理: ListView 针对List中每个item,要求 adapter "给 ...
最新文章
- vivado----fpga硬件调试 (二)----mark_debug
- socket编程之addrinfo结构体与getaddrinfo函数
- 最新阿里内推Java后端面试题
- stm32f103c8t6掉坑记
- 力扣【每日温度】leetcode-739.每日温度:单调栈解法
- 网络爬虫:使用多线程爬取网页链接
- gc日志一般关注什么_GC日志说明
- 【Python基础】pandas的骚操作:一行 pandas 代码搞定 Excel “条件格式”!
- src-d/gogit 使用
- 《从零开始学习ASP.NET MVC 1.0》-开天辟地入门篇
- webpack --- 发布环境的配置 代码压缩 代码分类
- asp.net core监控—引入Prometheus(五)
- SPOJ104 Highways,跨越数
- ListView 复用学习
- Office默认打开方式的改变方法以及安装程序莫名启动问题的权威汇总
- R语言实现故障树定量与定性分析——以GJB-Z 768A-1998 故障树分析指南图5.37为例
- Redis安装(Windows环境下Redis安装)
- 图解3GPP规范文档组织结构与编号规则
- 孙悟空在大闹蟠桃园的时候,第一天吃掉了所有桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。第一天开始吃的时候一共有多少个
- Linux如何让lst自动对齐,linux自動增加表空間