Android中的RecyclerView新组件初步上手指南

Android中的RecyclerView新组件初步上手指南,第1张

概述介绍RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动

介绍

RecyclerVIEw是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListVIEw相比,同样拥有item回收复用的功能,但是直接把vIEwholder的实现封装起来,用户只要实现自己的vIEwholder就可以了,该组件会自动帮你回收复用每一个item。
它不但变得更精简,也变得更加容易使用,而且更容易组合设计出自己需要的滑动布局。

RecyclerVIEw与ListVIEw原理是类似的:都是仅仅维护少量的VIEw并且可以展示大量的数据集。RecyclerVIEw用以下两种方式简化了数据的展示和处理:
(1)使用LayoutManager来确定每一个item的排列方式。
(2)为增加和删除项目提供默认的动画效果。
你也可以定义你自己的LayoutManager和添加删除动画,RecyclerVIEw项目结构如下:

(1)Adapter:使用RecyclerVIEw之前,你需要一个继承自RecyclerVIEw.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。
(2)LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个VIEw的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的VIEw和频繁的调用findVIEwByID方法(与ListVIEw原理类似)。
目前SDK中提供了三种自带的LayoutManager:
(1)linearlayoutmanager
(2)GrIDLayoutManager
(3)StaggeredGrIDLayoutManager

使用它的理由:
简单说,它是ListVIEw的进化,为了当你需要动态展示一组数据的时候就会需要它。
当然,如果只是动态展示数据,ListvIEw也可以做到,用它替代ListvIEw的原因有几个:
(1)简介中提到的它封装了vIEwholder的回收复用。
(2)RecyclerVIEw使用布局管理器管理子vIEw的位置(目前尚只提供了linearlayoutmanager),也就是说你再不用拘泥于ListVIEw的线性展示方式,如果之后提供其他custom LayoutManager的支持,你能够使用复杂的布局来展示一个动态组件。
(3)自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。

官方样例:
xml:

<!-- A RecyclerVIEw with some commonly used attributes --> <androID.support.v7.Widget.RecyclerVIEw   androID:ID="@+ID/my_recycler_vIEw"   androID:scrollbars="vertical"   androID:layout_wIDth="match_parent"   androID:layout_height="match_parent"/> 

main code:

public class MyActivity extends Activity {   private RecyclerVIEw mRecyclerVIEw;   private RecyclerVIEw.Adapter mAdapter;   private RecyclerVIEw.LayoutManager mLayoutManager;    @OverrIDe   protected voID onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentVIEw(R.layout.my_activity);     mRecyclerVIEw = (RecyclerVIEw) findVIEwByID(R.ID.my_recycler_vIEw);      // improve performance if you kNow that changes in content     // do not change the size of the RecyclerVIEw     mRecyclerVIEw.setHasFixedSize(true);      // use a linear layout manager     mLayoutManager = new linearlayoutmanager(this);     mRecyclerVIEw.setLayoutManager(mLayoutManager);      // specify an adapter (see also next example)     mAdapter = new MyAdapter(myDataset);     mRecyclerVIEw.setAdapter(mAdapter);   }   ... } 

adapter code:

public class MyAdapter extends RecyclerVIEw.Adapter<MyAdapter.VIEwHolder> {   private String[] mDataset;    // ProvIDe a reference to the type of vIEws that you are using   // (custom vIEwholder)   public static class VIEwHolder extends RecyclerVIEw.VIEwHolder {     public TextVIEw mTextVIEw;     public VIEwHolder(TextVIEw v) {       super(v);       mTextVIEw = v;     }   }    // ProvIDe a suitable constructor (depends on the kind of dataset)   public MyAdapter(String[] myDataset) {     mDataset = myDataset;   }    // Create new vIEws (invoked by the layout manager)   @OverrIDe   public MyAdapter.VIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) {     // create a new vIEw     VIEw v = LayoutInflater.from(parent.getContext())                 .inflate(R.layout.my_text_vIEw,parent,false);     // set the vIEw's size,margins,paddings and layout parameters     ...     VIEwHolder vh = new VIEwHolder(v);     return vh;   }    // Replace the contents of a vIEw (invoked by the layout manager)   @OverrIDe   public voID onBindVIEwHolder(VIEwHolder holder,int position) {     // - get element from your dataset at this position     // - replace the contents of the vIEw with that element     holder.mTextVIEw.setText(mDataset[position]);    }    // Return the size of your dataset (invoked by the layout manager)   @OverrIDe   public int getItemCount() {     return mDataset.length;   } } 

替用gallery:
笔者使用RecyclerVIEw的原因其实并不是为了使用一个新颖的组件去实现华丽的功能,就在前一天我还在到处寻找一个可以替代deprecated组件gallery的组件。其实在gallery弃用之后,RecyclerVIEw出来之前,VIEwPager和扩展ScrollVIEw是StackOverFlow上推荐的实现gallery的两种解决办法,但是都有一定的问题,ScrollVIEw要实现gallery的改动太大,VIEwPager替用的滑动体验和原来的gallery相去甚远。

顺着官方demo,我替换掉原来的VIEwPager类,使用RecylcerVIEw,改进有以下几点:

(1)使用过VIEwPager动画的应该知道(有经典的VIEwPager动画第三方扩展jazzyVIEwPager),这些动画是为了提供给每个item占据全屏,或占据几乎全屏这种情况设计的。也就是说,如果你简单地将VIEwPager的每页显示数设置为你需要的值,之后设置的动画很可能并不是你需要的效果(因此之前我在嵌套时去掉了VIEwPager的动画,稍微有点失望)。
(2)滑动速度加快,因为VIEwPager并不是VIEwsPager。。。一次长距离的滑动可能只造成1~2张图片的滚动,一点也不像gallery,这是我用RecylcerVIEw替代它的主要原因。

基于原来的代码,我构建了MyRecyclergallery,保留了原来的触摸事件,现在滑动起来舒服多了:

你可以看到滑动时还有滚动条。事件机制和原来一样,RecyclerVIEw的关键代码没有变化,所以就不放出源码了。

总结

以上是内存溢出为你收集整理的Android中的RecyclerView新组件初步上手指南全部内容,希望文章能够帮你解决Android中的RecyclerView新组件初步上手指南所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1141518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存