RecyclerView详解

简介: <p style="color:rgb(54,46,43); font-family:Arial; font-size:14px; line-height:26px"> RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewho

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

它不但变得更精简,也变得更加容易使用,而且更容易组合设计出自己需要的滑动布局。

要使用RecyclerView,请参考 ,其实你也可以只下载一个jar包,添加到自己的libs里就能使用它了,Recycler.jar

使用它的理由:

RecyclerView  is a more advanced and flexible version of  ListView . This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the  RecyclerView  widget when you have lists with elements that change dynamically.
简单说,它是ListView的进化,为了当你需要动态展示一组数据的时候就会需要它。

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

如果你想简单地入门这个组件,请参考

官方样例:

xml:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!-- A RecyclerView with some commonly used attributes -->  
  2. <android.support.v7.widget.RecyclerView  
  3.     android:id="@+id/my_recycler_view"  
  4.     android:scrollbars="vertical"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"/>  

main code:
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MyActivity extends Activity {  
  2.     private RecyclerView mRecyclerView;  
  3.     private RecyclerView.Adapter mAdapter;  
  4.     private RecyclerView.LayoutManager mLayoutManager;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.my_activity);  
  10.         mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);  
  11.   
  12.         // improve performance if you know that changes in content  
  13.         // do not change the size of the RecyclerView  
  14.         mRecyclerView.setHasFixedSize(true);  
  15.   
  16.         // use a linear layout manager  
  17.         mLayoutManager = new LinearLayoutManager(this);  
  18.         mRecyclerView.setLayoutManager(mLayoutManager);  
  19.   
  20.         // specify an adapter (see also next example)  
  21.         mAdapter = new MyAdapter(myDataset);  
  22.         mRecyclerView.setAdapter(mAdapter);  
  23.     }  
  24.     ...  
  25. }  
adapter code:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {  
  2.     private String[] mDataset;  
  3.   
  4.     // Provide a reference to the type of views that you are using  
  5.     // (custom viewholder)  
  6.     public static class ViewHolder extends RecyclerView.ViewHolder {  
  7.         public TextView mTextView;  
  8.         public ViewHolder(TextView v) {  
  9.             super(v);  
  10.             mTextView = v;  
  11.         }  
  12.     }  
  13.   
  14.     // Provide a suitable constructor (depends on the kind of dataset)  
  15.     public MyAdapter(String[] myDataset) {  
  16.         mDataset = myDataset;  
  17.     }  
  18.   
  19.     // Create new views (invoked by the layout manager)  
  20.     @Override  
  21.     public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,  
  22.                                                    int viewType) {  
  23.         // create a new view  
  24.         View v = LayoutInflater.from(parent.getContext())  
  25.                                .inflate(R.layout.my_text_view, parent, false);  
  26.         // set the view's size, margins, paddings and layout parameters  
  27.         ...  
  28.         ViewHolder vh = new ViewHolder(v);  
  29.         return vh;  
  30.     }  
  31.   
  32.     // Replace the contents of a view (invoked by the layout manager)  
  33.     @Override  
  34.     public void onBindViewHolder(ViewHolder holder, int position) {  
  35.         // - get element from your dataset at this position  
  36.         // - replace the contents of the view with that element  
  37.         holder.mTextView.setText(mDataset[position]);  
  38.   
  39.     }  
  40.   
  41.     // Return the size of your dataset (invoked by the layout manager)  
  42.     @Override  
  43.     public int getItemCount() {  
  44.         return mDataset.length;  
  45.     }  
  46. }  

替用Gallery:

笔者使用RecyclerView的原因其实并不是为了使用一个新颖的组件去实现华丽的功能,就在前一天我还在到处寻找一个可以替代deprecated组件Gallery的组件。在 android滑动组件嵌套一般思路,多任务手势思路,触摸传递思路,【例】listview嵌套viewpager 中我介绍了ListView嵌套ViewPager显示图片的办法。其实在Gallery弃用之后,RecyclerView出来之前,ViewPager和扩展ScrollView是StackOverFlow上推荐的实现Gallery的两种解决办法,但是都有一定的问题,ScrollView要实现Gallery的改动太大,ViewPager替用的滑动体验和原来的Gallery相去甚远。

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

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

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

你可以看到滑动时还有滚动条。
事件机制和原来一样,RecyclerView的关键代码没有变化,所以就不放出源码了。
目录
相关文章
|
11月前
|
搜索推荐 Java 开发工具
RecyclerView的那点事儿
RecyclerView的那点事儿
63 0
|
前端开发 Android开发
RecyclerView实现吸底效果—ItemDecoration
RecyclerView实现吸底效果—ItemDecoration
RecyclerView学习-RecyclerView#Adapter#notifyDataSetChanged是如何更新数据的?
RecyclerView学习-RecyclerView#Adapter#notifyDataSetChanged是如何更新数据的?
SwipeRefreshLayout与RecyclerView的巧夺天工(二)
SwipeRefreshLayout与RecyclerView的巧夺天工(二)
62 0
SwipeRefreshLayout与RecyclerView的巧夺天工(二)
SwipeRefreshLayout与RecyclerView的巧夺天工(一)
SwipeRefreshLayout与RecyclerView的巧夺天工(一)
66 0
RecyclerView与CardView的使用(二)
RecyclerView与CardView的使用(二)
102 0
RecyclerView与CardView的使用(二)
|
开发工具 Android开发
RecyclerView与CardView的使用(一)
RecyclerView与CardView的使用(一)
125 0
RecyclerView与CardView的使用(一)
|
Java 容器
【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )
【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )
160 0
|
存储 缓存 Java
RecyclerView问题汇总
目录介绍 25.0.0.0 请说一下RecyclerView?adapter的作用是什么,几个方法是做什么用的?如何理解adapter订阅者模式? 25.0.0.1 ViewHolder的作用是什么?如何理解ViewHolder的复用?什么时候停止调用onCreateViewHolder? 25.
2948 0