热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

RecyclerView是Android5.0materialsdesign中的组件之一RecyclerView是ListView的升级版本,更加先进和


RecyclerView是 Android 5.0 materials 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 就能搞定一切。代码设置和效果如下

mListView = (ListView) findViewById(R.id.lv_show_tidy);
mListView.setEmptyView();
RecyclerView是 Android 5.0 materials 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的机制


推荐阅读
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • SmartRefreshLayout自定义头部刷新和底部加载
    1.添加依赖implementation‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.3’implementation‘com.s ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • python3 logging
    python3logginghttps:docs.python.org3.5librarylogging.html,先3.5是因为我当前的python版本是3.5之所 ... [详细]
author-avatar
666666顺2502878433
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有