ListView优化-getView优化

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<View> views;
 4     private View convertView;
 5 
 6      private ViewHolder(View convertView){
 7          this.views = new SparseArray<View>();
 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 extends View> 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:// 触摸listView
18    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值