Android 性能优化<九> RecyclerView替代Listview用法

Android 性能优化 (一)APK高效瘦身 

http://blog.csdn.net/whb20081815/article/details/70140063

Android 性能优化 (二)数据库优化 秒变大神

http://blog.csdn.net/whb20081815/article/details/70142033

  Android 性能优化(三)布局优化 秒变大神 

http://blog.csdn.net/whb20081815/article/details/70147958

 Android 性能优化(四)内存优化OOM 秒变大神

 http://blog.csdn.net/whb20081815/article/details/70243105

Android 性能优化(五)ANR 秒变大神

http://blog.csdn.net/whb20081815/article/details/70245594

Android 性能优化(六) RelativeLayout和LinearLayout性能比较

http://blog.csdn.net/whb20081815/article/details/74465870

  Android 性能优化<七>自定义view绘制优化 

http://blog.csdn.net/whb20081815/article/details/74474736

Android 性能优化<八> 多线程优化和线程管理

https://blog.csdn.net/WHB20081815/article/details/77775444

Android 性能优化 <九>RecyclerView替代Listview用法

https://blog.csdn.net/WHB20081815/article/details/76221998

 

RecyclerView是Android5.0materials design中的组件之一

RecyclerView 是 ListView 的升级版本,更加先进和灵活。

看名字我们就能看出一点端倪,没错,它主要的特点就是复用

 

 

Android 默认提供的 RecyclerView 就能支持 线性布局、网格布局、瀑布流布局 三种

 

  • 横向滚动的ListView开源控件是不是可以不用再找了?对,你没看错!
  • 瀑布流效果的开源控件是不是可以不用再找了?对,你没看错!
  • 连横向滚动的GridView都不用找了!对,你没看错!

 

从基础使用上看,我们明显可以看出,RecyclerView 相比 ListView 在基础使用上的区别主要有如下几点:

  • ViewHolder 的编写规范化了
  • RecyclerView 复用 Item 的工作 Google 全帮你搞定,不再需要像 ListView 那样自己调用 setTag
  • RecyclerView 需要多出一步 LayoutManager 的设置工作

 

 

如何在Studio中添加V7包?

http://blog.csdn.net/loveyaozu/article/details/53035587

 

 

例子:

 

 

initData();

mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
mAdapter = new HomeAdapter(this, mDatas);

//设置垂直,水平,gridview还是listview类型
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
        StaggeredGridLayoutManager.VERTICAL));
mRecyclerView.setAdapter(mAdapter);

//设置分割线
mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this));
// 设置item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

initEvent();


Button  btn_grid=(Button) findViewById(R.id.grad_view);
btn_grid.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 4));
    }
});

Button  btn_stoggle=(Button) findViewById(R.id.stoggle);
btn_stoggle.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
                StaggeredGridLayoutManager.HORIZONTAL));
    }
});

 

 

 

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{

   private List<String> mDatas;
   private LayoutInflater mInflater;

   public interface OnItemClickLitener
   {
      void onItemClick(View view, int position);
      void onItemLongClick(View view, int position);
   }

   private OnItemClickLitener mOnItemClickLitener;

   public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
   {
      this.mOnItemClickLitener = mOnItemClickLitener;
   }
   

   public HomeAdapter(Context context, List<String> datas)
   {
      mInflater = LayoutInflater.from(context);
      mDatas = datas;
   }

   @Override
   public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
   {
      MyViewHolder holder = new MyViewHolder(mInflater.inflate(
            R.layout.item_layout, parent, false));
      return holder;
   }

   @Override
   public void onBindViewHolder(final MyViewHolder holder, final int position)
   {
      holder.tv.setText(mDatas.get(position));

      // 如果设置了回调,则设置点击事件
      if (mOnItemClickLitener != null)
      {
         holder.itemView.setOnClickListener(new OnClickListener()
         {
            @Override
            public void onClick(View v)
            {
               int pos = holder.getLayoutPosition();
               mOnItemClickLitener.onItemClick(holder.itemView, pos);
            }
         });
         
         holder.itemView.setOnLongClickListener(new OnLongClickListener()
         {
            @Override
            public boolean onLongClick(View v)
            {
               int pos = holder.getLayoutPosition();
               mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
               removeData(pos);
               return false;
            }
         });
      }
   }

   @Override
   public int getItemCount()
   {
      return mDatas.size();
   }

   public void addData(int position)
   {
      mDatas.add(position, "Insert One");
      notifyItemInserted(position);
   }


   public void removeData(int position)
   {
      mDatas.remove(position);
      notifyItemRemoved(position);
   }

   class MyViewHolder extends ViewHolder
   {

      TextView tv;

      public MyViewHolder(View view)
      {
         super(view);
         tv = (TextView) view.findViewById(R.id.id_num);
      
      
      }
   }
}

 

 

 

 

主要的API和方法:整体总结它的几点如下:

Adapter:包装数据集合并且为每个条目创建视图。

ViewHolder:保存用于显示每个数据条目的子View。

LayoutManager:将每个条目的视图放置于适当的位置。

ItemDecoration:在每个条目的视图的周围或上面绘制一些装饰视图(我们可以通过该方法添加分割线)。

ItemAnimator:在条目被添加、移除或者重排序时添加动画效果。

 

  • 系统提供了几种LayoutManager的使用;
  • 如何通过自定义ItemDecoration去设置分割线,或者一些你想作为分隔的drawable,注意这里 
    巧妙的使用了系统的listDivider属性,你可以尝试添加使用divider和dividerHeight属性。
  • 如何使用ItemAnimator为RecylerView去添加Item移除、添加的动画效果。
  • 介绍了如何添加ItemClickListener与ItemLongClickListener。

 

 

 

RecyclerView和ListView的区别:

 

1)。.Listview支持,HeaderView 和 FooterView

RecyclerView 要自己写

2).ListViewAnimations 主要大致实现方式是通过装饰者模式来扩充 Adapter ,并结合属性动画 Animator 来添加动画效果。相比之下,RecyclerView 则为我们提供了很多基本的动画 API ,如下方的增删移改

 

3).局部刷新

 

朋友圈点赞,点赞只是更新当前点赞的Item,并不需要每个 Item 都更新。

public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

 

RecyclerView.Adapter 则我们提供了 notifyItemChanged 用于更新单个 Item View 的刷新,我们可以省去自己写局部更新的工作。

 

public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。

public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新

public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。

public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。

 

 

 

 

嵌套滚动机制

一开始上面一大块区域就是 CollapsingToolbarLayout ,下方的列表是 RecyclerView ,当然 RecyclerView 向上滑动时,CollapsingToolbarLayout 能够同时网上收缩,直到只剩下顶部的 Toolbar。之所以能够实现这种效果,就是完全依赖于嵌套滚动机制,如果没有这套机制,按照原有的触摸事件分发逻辑, RecyclerView 内部已经把 Touch 事件消耗掉了,完全无法引起顶部的 CollapsingToolbarLayout 产生联动收缩的效果。我们可以查看 RecyclerView 的代码实现,发现它已经实现了 NestedScrollingChild 接口

 

 

应用场景:RecyclerView用在数据刷新频繁的时候

答案是否定的,从性能上看,RecyclerView并没有带来显著的提升,不需要频繁更新,暂不支持用动画,意味着RecyclerView优势也不太明显,没有太大的吸引力,ListView已经能很好地满足业务需求。
 

总结:

1.很强大的包含gridview和瀑布流

2.左右滑动

3.动画效果

4.不能添加头部和尾部

5.局部刷新,添加删除都动画,它会自动添加和移除item的动画

 

 

参考博客:

http://blog.csdn.net/lmj623565791/article/details/45059587

 

 

空数据处理

ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况,只需轻轻一 set 就能搞定一切。代码设置和效果如下

 

 

mListView = (ListView) findViewById(R.id.lv_show_tidy);
mListView.setEmptyView();

RecyclerView是Android5.0materials design中的组件之一

RecyclerView 是 ListView 的升级版本,更加先进和灵活。

看名字我们就能看出一点端倪,没错,它主要的特点就是复用

 

 

Android 默认提供的 RecyclerView 就能支持 线性布局、网格布局、瀑布流布局 三种

 

  • 横向滚动的ListView开源控件是不是可以不用再找了?对,你没看错!
  • 瀑布流效果的开源控件是不是可以不用再找了?对,你没看错!
  • 连横向滚动的GridView都不用找了!对,你没看错!

 

从基础使用上看,我们明显可以看出,RecyclerView 相比 ListView 在基础使用上的区别主要有如下几点:

  • ViewHolder 的编写规范化了
  • RecyclerView 复用 Item 的工作 Google 全帮你搞定,不再需要像 ListView 那样自己调用 setTag
  • RecyclerView 需要多出一步 LayoutManager 的设置工作

 

 

如何在Studio中添加V7包?

http://blog.csdn.net/loveyaozu/article/details/53035587

 

 

例子:

 

 

 

initData();

mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
mAdapter = new HomeAdapter(this, mDatas);

//设置垂直,水平,gridview还是listview类型
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
        StaggeredGridLayoutManager.VERTICAL));
mRecyclerView.setAdapter(mAdapter);

//设置分割线
mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this));
// 设置item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

initEvent();


Button  btn_grid=(Button) findViewById(R.id.grad_view);
btn_grid.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 4));
    }
});

Button  btn_stoggle=(Button) findViewById(R.id.stoggle);
btn_stoggle.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
                StaggeredGridLayoutManager.HORIZONTAL));
    }
});

 

 

 

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{

   private List<String> mDatas;
   private LayoutInflater mInflater;

   public interface OnItemClickLitener
   {
      void onItemClick(View view, int position);
      void onItemLongClick(View view, int position);
   }

   private OnItemClickLitener mOnItemClickLitener;

   public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
   {
      this.mOnItemClickLitener = mOnItemClickLitener;
   }
   

   public HomeAdapter(Context context, List<String> datas)
   {
      mInflater = LayoutInflater.from(context);
      mDatas = datas;
   }

   @Override
   public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
   {
      MyViewHolder holder = new MyViewHolder(mInflater.inflate(
            R.layout.item_layout, parent, false));
      return holder;
   }

   @Override
   public void onBindViewHolder(final MyViewHolder holder, final int position)
   {
      holder.tv.setText(mDatas.get(position));

      // 如果设置了回调,则设置点击事件
      if (mOnItemClickLitener != null)
      {
         holder.itemView.setOnClickListener(new OnClickListener()
         {
            @Override
            public void onClick(View v)
            {
               int pos = holder.getLayoutPosition();
               mOnItemClickLitener.onItemClick(holder.itemView, pos);
            }
         });
         
         holder.itemView.setOnLongClickListener(new OnLongClickListener()
         {
            @Override
            public boolean onLongClick(View v)
            {
               int pos = holder.getLayoutPosition();
               mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
               removeData(pos);
               return false;
            }
         });
      }
   }

   @Override
   public int getItemCount()
   {
      return mDatas.size();
   }

   public void addData(int position)
   {
      mDatas.add(position, "Insert One");
      notifyItemInserted(position);
   }


   public void removeData(int position)
   {
      mDatas.remove(position);
      notifyItemRemoved(position);
   }

   class MyViewHolder extends ViewHolder
   {

      TextView tv;

      public MyViewHolder(View view)
      {
         super(view);
         tv = (TextView) view.findViewById(R.id.id_num);
      
      
      }
   }
}

 

 

 

 

主要的API和方法:整体总结它的几点如下:

Adapter:包装数据集合并且为每个条目创建视图。

ViewHolder:保存用于显示每个数据条目的子View。

LayoutManager:将每个条目的视图放置于适当的位置。

ItemDecoration:在每个条目的视图的周围或上面绘制一些装饰视图(我们可以通过该方法添加分割线)。

ItemAnimator:在条目被添加、移除或者重排序时添加动画效果。

 

  • 系统提供了几种LayoutManager的使用;
  • 如何通过自定义ItemDecoration去设置分割线,或者一些你想作为分隔的drawable,注意这里 
    巧妙的使用了系统的listDivider属性,你可以尝试添加使用divider和dividerHeight属性。
  • 如何使用ItemAnimator为RecylerView去添加Item移除、添加的动画效果。
  • 介绍了如何添加ItemClickListener与ItemLongClickListener。

 

 

 

RecyclerView和ListView的区别:

 

1)。.Listview支持,HeaderView 和 FooterView

RecyclerView 要自己写

2).ListViewAnimations 主要大致实现方式是通过装饰者模式来扩充 Adapter ,并结合属性动画 Animator 来添加动画效果。相比之下,RecyclerView 则为我们提供了很多基本的动画 API ,如下方的增删移改

 

3).局部刷新

 

朋友圈点赞,点赞只是更新当前点赞的Item,并不需要每个 Item 都更新。

public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

 

RecyclerView.Adapter 则我们提供了 notifyItemChanged 用于更新单个 Item View 的刷新,我们可以省去自己写局部更新的工作。

 

public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。

public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新

public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。

public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。

 

 

 

 

嵌套滚动机制

 

一开始上面一大块区域就是 CollapsingToolbarLayout ,下方的列表是 RecyclerView ,当然 RecyclerView 向上滑动时,CollapsingToolbarLayout 能够同时网上收缩,直到只剩下顶部的 Toolbar。之所以能够实现这种效果,就是完全依赖于嵌套滚动机制,如果没有这套机制,按照原有的触摸事件分发逻辑, RecyclerView 内部已经把 Touch 事件消耗掉了,完全无法引起顶部的 CollapsingToolbarLayout 产生联动收缩的效果。我们可以查看 RecyclerView 的代码实现,发现它已经实现了 NestedScrollingChild 接口

 

 

应用场景:RecyclerView用在数据刷新频繁的时候

答案是否定的,从性能上看,RecyclerView并没有带来显著的提升,不需要频繁更新,暂不支持用动画,意味着RecyclerView优势也不太明显,没有太大的吸引力,ListView已经能很好地满足业务需求。
 

总结:

1.很强大的包含gridview和瀑布流

2.左右滑动

3.动画效果

4.不能添加头部和尾部

5.局部刷新,添加删除都动画,它会自动添加和移除item的动画

 

 

参考博客:

http://blog.csdn.net/lmj623565791/article/details/45059587

 

 

空数据处理

ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况,只需轻轻一 set 就能搞定一切。代码设置和效果如下

 

问题:

  ListView的优化?

深入理解ListView的机制

 

 

mListView = (ListView) findViewById(R.id.lv_show_tidy);
mListView.setEmptyView();

问题:

  ListView的优化?

深入理解ListView的机制

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值