博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ListView优化-getView优化
阅读量:7015 次
发布时间:2019-06-28

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

ListView作为Android中最常用的组件之一,其优化方式也比较多。

在使用ListView或是GridView的时候,往往需要自定义数据适配器。一般我们都需要复习getView方法。对于此方法的优化也我们对ListView的优化的重点之一。

1.重用convertView

  ListView获GrideView要加载View的时候,会调用很多次getView()。因此会创建很多的View对象。如果ListView中的数据比较多。那么对于嵌入式的应用程序是吃不消的。好大这里Android提供了Recycler机制。可以利用convertView对view进行复用。View的每次创建都会消耗一定的时间,过多的View也会占用较大的内存。如果应用此方法,效果会有显著提升。因此需要对getView方法中传入的convertView进行空判断(null != convertView)。如果不为空的话,就可以重用之前创建好的,不需要再另外创建一个。

2.使用ViewHolder

  使用ViewHolder可以将getView中的需要使用的View进行封装,以供下次直接使用。因为View的findViewById也是非常耗时的,如果ListView的ItemView比较多的话,单个布局比较复杂的话,这种提升效果更加明显。这里可以将封装好的ViewHolder对象放到convertView中(setTag)。后面convertView有值了可以使用从convertView中获得ViewHolder对象(getTag)

3.使用静态的ViewHolder

    为什么使用静态的ViewHolder:

    1.内部类尽量使用static,是java规范。比如外部使用该内部类,可以避免实例化内部类所在的类。

    2.我的理解是:ViewHolder holder = new ViewHolder()每次都是在stack中开辟一块内存保存 holder的地址  然后在heap中 分配ViewHolder的内存(需确认)

4.封装ViewHolder

    这个对优化作用并不大,主要是代码比较简洁,容读.

1 public class ViewHolder{ 2   3     private final SparseArray
views; 4 private View convertView; 5 6 private ViewHolder(View convertView){ 7 this.views = new SparseArray
(); 8 this.convertView = convertView; 9 convertView.setTag(this);10 }11 12 public static ViewHolder get(View convertView){13 if (convertView == null) {14 return new ViewHolder(convertView);15 }16 ViewHolder existedHolder = (ViewHolder) convertView.getTag();17 return existedHolder;18 }19 20 public
T getView(int viewId) {21 View view = views.get(viewId);22 if (view == null) {23 view = convertView.findViewById(viewId);24 views.put(viewId, view);25 }26 return (T) view;27 }28 }

5.getView不做耗时操作

    getView 函数一定不能耗时,有耗时任务要异步加载。

   

主要的方法:

  1. 先判断当前 ListView 的状态,只有 ListView 停止滑动才开启新线程加载数据,其他状态均忽略。

  2. 使用 getFirstVisiblePosition 和 getLastVisiblePosition 方法来显示 item。

  3. 耗时任务一定不要在 getView 方法中进行,最好异步进行。

1  //1. 判断listView状态 2  AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {
// ListView 3 // 触摸事件 4 5 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 6 } 7 8 public void onScrollStateChanged(AbsListView view, int scrollState) { 9 switch (scrollState) {10 case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 滑动状态11 threadFlag = false;12 break;13 case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 停止14 threadFlag = true;15 startThread();//开启新线程,加载数据16 break;17 case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 触摸listView18 threadFlag = false;19 break;20 default:21 // Toast.makeText(contextt, "default",22 // Toast.LENGTH_SHORT).show();23 break;24 }25 }26 };

 

转载于:https://www.cnblogs.com/pillowzhou/p/4941275.html

你可能感兴趣的文章
MySQL高可用新玩法之MGR+Consul
查看>>
使用MegaCli监控Linux硬盘
查看>>
MyBatis连接SQL Server的关键点
查看>>
MySQL--各版本DDL 操作总结
查看>>
Java并发编程:深入剖析ThreadLocal
查看>>
FluentScheduler定时器计划任务
查看>>
JUC-Condition和Lock实践-线程按序交替执行
查看>>
Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key.
查看>>
【报错】引入jar包import org.apache.commons.codec.digest.DigestUtils 报错,jar不存在
查看>>
网络结构
查看>>
HTTP中的重定向和请求转发的区别
查看>>
laravel 授权使用gate门类
查看>>
NetScaler + Wireshark = A Perfect Combination!
查看>>
[抄]使用网页进行展示而非PPT
查看>>
Throwable和Exception的区别
查看>>
也来讲REST、SOAP
查看>>
012 字典
查看>>
CentOS7配置Mysql热备份
查看>>
java.lang.IllegalArgumentException: No enum constant org.apache.ws.commons.schema.XmlSchemaForm.
查看>>
解读90后关键词 新生的红利市场在哪?
查看>>