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

 

 

例子:

RecyclerView替代Listview用法_第1张图片" class="has" src="https://img.it610.com/image/info8/e20a6e360b31451c9e05ced56cac0892.gif" width="459" height="695" style="border:1px solid black;">

 

 

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{   private List 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 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{   private List 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 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的机制

 

更多相关文章

  1. Android(安卓)各种音量的获取和设置
  2. Set Positive|Neutral|Negative Button disabled in AlertDialog
  3. Android(安卓)studio自动下载第三方jar包速度慢的问题解决方法
  4. 关于启动Activity动画样式以及问题。
  5. Android在一个TextView里显示不同样式的字体
  6. Android(安卓)TypeArray
  7. Android判断某一应用是否正在运行与判断某一Service是否正在运行
  8. android 记录和恢复ListView滚动的位置 四种方法
  9. android中EditText只允许输入汉字(过滤汉字)

随机推荐

  1. Speeding Up the Android(安卓)Emulator
  2. android,service实例,播放音乐
  3. Android——HttpUrlConnection
  4. Android(安卓)实现MD5加密
  5. TabHost自定义标签页(二)
  6. The method Inflate() in android
  7. Android(安卓)Api WindowManager.LayoutP
  8. Android监控软键盘变化实例
  9. Android(安卓)应用获取通知栏权限
  10. Android中Preference的使用以及监听事件