RecyclerView详解

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:

 <!-- 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的组件。在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的关键代码没有变化,所以就不放出源码了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Android View架构总结

View和Activity的区别 android的四大组件,Activity是四大组件中唯一一个用来和用户进行交互的组件。可以说Activity就是androi...

25860
来自专栏向治洪

仿今日头条顶部导航效果

 之前发现很多人在群里面、论坛上求网易新闻客户端的源码,之后我就去下了个网易新闻客户端和今日头条新闻客户端,发现他们的大体是一样的,于是在最近的空闲时间,便去琢...

1.1K80
来自专栏向治洪

actionbar详解(二)

经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对较为深刻的理解了。唯一欠缺的是,前面我们都只是学习了理论知识而已,虽然知识点已经掌握了,但是...

20580
来自专栏青蛙要fly的专栏

项目需求讨论-WebView进度加载条

又到了每次的实际项目开发中的需求讨论了。这次是因为做的项目是原生内嵌WebView,所以当我们的WebView在加载网页的时候,需要有个加载进度条,当然这时候有...

14930
来自专栏向治洪

可拖拽gridview

在Android开发中,我们常常用到ListView和GridView,而有的时候系统的ListView,GridView并不能满足我们的需求,所以我们需要自己...

32350
来自专栏郭霖

Android ActionBar应用实战,高仿微信主界面的设计

经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对较为深刻的理解了。唯一欠缺的是,前面我们都只是学习了理论知识而已,虽然知识点已经掌握了,但是...

31250
来自专栏图像识别与深度学习

《Android》Lesson04-Menu

21370
来自专栏刘望舒

Android 屏幕适配从未如此简单

一个月前看了今日头条新的屏幕适配方案,对此不禁拍案叫绝,为此我想把这种方案融入到我工具类中直接一行代码即可适配,如今最新 1.18.0 版 AndroidUti...

14420
来自专栏Android干货

安卓开发_慕课网_百度地图_实现模式转换

42880
来自专栏Android机器圈

Android图片处理--缩放

把ImageView或者PhotoView的对象名直接添加到display中就OK 了。

27660

扫码关注云+社区

领取腾讯云代金券