A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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
  这个对优化作用并不大,主要是代码比较简洁,容读.
[HTML] 纯文本查看 复制代码
public class ViewHolder{
 
    private final SparseArray<View> views;
    private View convertView;

     private ViewHolder(View convertView){
         this.views = new SparseArray<View>();
         this.convertView = convertView;
         convertView.setTag(this);
     }
 
     public static ViewHolder get(View convertView){
         if (convertView == null) {
             return new ViewHolder(convertView);
         }
         ViewHolder existedHolder = (ViewHolder) convertView.getTag();
         return existedHolder;
     }
  
     public <T extends View> T getView(int viewId) {
         View view = views.get(viewId);
         if (view == null) {
             view = convertView.findViewById(viewId);
             views.put(viewId, view);
         }
         return (T) view;
     }
 }

  5.getView不做耗时操作
  getView 函数一定不能耗时,有耗时任务要异步加载。
  主要的方法:
  先判断当前 ListView 的状态,只有 ListView 停止滑动才开启新线程加载数据,其他状态均忽略。
  使用 getFirstVisiblePosition 和 getLastVisiblePosition 方法来显示 item。
  耗时任务一定不要在 getView 方法中进行,最好异步进行。
[HTML] 纯文本查看 复制代码
//1. 判断listView状态
 AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {// ListView
 // 触摸事件
 
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
 }
 
 public void onScrollStateChanged(AbsListView view, int scrollState) {
 switch (scrollState) {
   case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 滑动状态
   threadFlag = false;
   break;
   case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 停止
   threadFlag = true;
   startThread();//开启新线程,加载数据
   break;
   case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 触摸listView
   threadFlag = false;
   break;
   default:
   // Toast.makeText(contextt, "default",
   // Toast.LENGTH_SHORT).show();
   break;
   }
 }
 };



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马