简介:

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:
  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:

  1. public class MyActivity extends Activity {
  2. private RecyclerView mRecyclerView;
  3. private RecyclerView.Adapter mAdapter;
  4. private RecyclerView.LayoutManager mLayoutManager;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.my_activity);
  9. mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
  10. // improve performance if you know that changes in content
  11. // do not change the size of the RecyclerView
  12. mRecyclerView.setHasFixedSize(true);
  13. // use a linear layout manager
  14. mLayoutManager = new LinearLayoutManager(this);
  15. mRecyclerView.setLayoutManager(mLayoutManager);
  16. // specify an adapter (see also next example)
  17. mAdapter = new MyAdapter(myDataset);
  18. mRecyclerView.setAdapter(mAdapter);
  19. }
  20. ...
  21. }

adapter code:

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

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

【转】android新组件RecyclerView使用介绍和进阶使用,替用Gallery的更多相关文章

  1. android新组件RecyclerView使用介绍和进阶使用,替用Gallery

    简介: RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用 ...

  2. Android新组件RecyclerView介绍,其效率更好

    今天我们首先来说为什么要介绍这个新组件RecyclerView,因为前几天我发布了一个常用面试题ListView的复用及如何优化的文章,介绍给一些开发者,但是我看到有关的反馈说:现在都不再用listv ...

  3. Android自定义组件系列【5】——进阶实践(2)

    上一篇<Android自定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一 ...

  4. Android自定义组件系列【7】——进阶实践(4)

    上一篇<Android自定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识,这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpan ...

  5. Android自定义组件系列【6】——进阶实践(3)

    上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划 ...

  6. Android最新组件RecyclerView,替代ListView

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40379159 万众瞩目的android最新5.0版本号不久前已经正式公布了,对于我 ...

  7. 【转】Android新组件Material Dialog,SwipeRefreshLayout,ListPopupWindow,PopupMenu等

    朝花夕拾----新组件的学习和使用 分类: Android UI2015-06-26 11:31 440人阅读 评论(0) 收藏 举报 uidialogMaterial   目录(?)[-] Mate ...

  8. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  9. Android四大组件:BroadcastReceiver 介绍

    介绍 BroadcastReceiver 即广播组件,是 Android 的四大组件之一.用于监听和接收广播消息,并做出响应.有以下一些应用: 不同组件之间的通信(应用内或不同应用之间). 多线程之间 ...

随机推荐

  1. [Angular] Provide Feedback to Progress Events with Angular’s HttpRequest Object

    In some cases your application might need to upload large amounts of data, such as files. Obviously ...

  2. iOS-UIImage imageWithContentsOfFile 和 imageName 对照

    1.imageWithContentsOfFile NSString *imagePath = [NSString stringWithFormat:@"%@/%@",[[NSBu ...

  3. Java 实现适配器(Adapter)模式

    平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...

  4. 对象不支持“abigimage”属性或方法

    在一个网页中用了一个js插件, js文件引用的没有错,代码也和demo差点儿相同,  可是执行时ie的调试工具报了一个错: 解决方式: jquery文件冲突,发现原来自己引过一个 <script ...

  5. ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

    题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题 ...

  6. 棋盘覆盖问题python3实现

    在2^k*2^k个方格组成的棋盘中,有一个方格被占用,用下图的4种L型骨牌覆盖全部棋盘上的其余全部方格,不能重叠. 代码例如以下: def chess(tr,tc,pr,pc,size): globa ...

  7. linux数据库升级

    转自:老左博客:http://www.laozuo.org/6145.html 老左今天有在帮朋友的博客搬迁到另外一台VPS主机环境,其环境采用的是LLSMP架构的,原先的服务器采用的是LNMP网站环 ...

  8. xBIM 基础03 基本模型操作

    系列目录    [已更新最新开发文章,点击查看详细]  本篇将使用基本的代码示例来表示如何使用xBIM.我们将介绍持久存储的四个基本功能,即 CRUD(创建,检索,更新和删除).以下示例通常适用于IF ...

  9. POJ 1952 DP

    思路: 这题要求最长下降子序列的长度和个数,我们可以增加 数组maxlen[size](记录当前第1个点到第i个点之间的最长下降序列长度) 和maxnum[size](记录1~i之间的最长下降序列个数 ...

  10. Android集成第三方微信登录

    第一步: 在微信开放平台创建安卓应用,需要输入的包名和签名就不用再提吧,不知道的自行百度. 应用创建完毕后会得到两个值:AppID.AppSecret,用这两个值来请求微信. 然后去微信开放平台的资源 ...