首页 > 其他分享 >RecyclerView详解

RecyclerView详解

时间:2022-11-28 16:32:56浏览次数:54  
标签:layout ViewPager 详解 组件 RecyclerView public view


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



  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​​​ ​​​cop



  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. true);  
  15.   
  16. // use a linear layout manager  
  17. new LinearLayoutManager(this);  
  18.         mRecyclerView.setLayoutManager(mLayoutManager);  
  19.   
  20. // specify an adapter (see also next example)  
  21. new MyAdapter(myDataset);  
  22.         mRecyclerView.setAdapter(mAdapter);  
  23.     }  
  24.     ...  
  25. }  

adapter code:



[java]  ​​view plain​​​ ​​​cop



  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. false);  
  26. // set the view's size, margins, paddings and layout parameters  
  27.         ...  
  28. 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详解_ide


你可以看到滑动时还有滚动条。


事件机制和原来一样,RecyclerView的关键代码没有变化,所以就不放出源码了。

标签:layout,ViewPager,详解,组件,RecyclerView,public,view
From: https://blog.51cto.com/u_13657808/5891907

相关文章

  • 数据分析八大模型:详解RFM模型
    一、RFM的基本思路RFM模型由三个基础指标组成:R:最近一次消费至今的时间F:一定时间内重复消费频率M:一定时间内累计消费金额 RFM模型里,三个变量的含义是很具体......
  • 【c++】map用法详解
    【c++】map用法详解LeeMooq已于2022-05-0122:01:43修改21398收藏46分类专栏:c++学习文章标签:c++版权c++学习专栏收录该内容5篇文章3订阅订阅专栏map是c++标准......
  • 常用css属性flex: 1详解
    flex:1实际代表的是三个属性的简写flex-grow是用来增大盒子的,比如,当父盒子的宽度大于子盒子的宽度,父盒子的剩余空间可以利用flex-grow来设置子盒子增大的占比flex-shrin......
  • vue的.sync修饰符用法及原理详解
    vue.sync的历史vue.sync修饰符最初存在于vue1.0版本里,但是在2.0中被移除了。但是在2.0发布之后的实际应用中,vue官方发现.sync还是有其适用之处,比如在开发可复......
  • 详解sklearn的多分类模型评价指标
    说到准确率accuracy、精确率precision,召回率recall等指标,有机器学习基础的应该很熟悉了,但是一般的理论科普文章,举的例子通常是二分类,而当模型是多分类时,使用sklearn包去计......
  • TCP/UDP的连接与关闭详解
    https://blog.csdn.net/pupoqian3720/article/details/81290011传输层:总体作用:在广域网中建立数据传输通道,进行数据传输,负责端到端的通信那么是什么是端到端呢?A:两个方......
  • linux c下程序调试工具详解
    1.htop/tophtoptophtop主要参数说明#Time:当前时间#Uptime:系统运行时间#Tasks:进程总数、当前进程运行数#Loadaverage:1、5、10分钟的负载情况#Avg:系统CPU......
  • 透明巨页和巨页的详解
    大页内存大页内存(HugePages),有时也叫“大内存页”、“内存大页”、“标准大页”。操作系统以内存页为单位管理内存,内存页的大小对系统性能有影响。内存页设得太小,内存页......
  • React 学习笔记之二 - React 详解
    2.1为什么使用ReactReact.js只是一个JS库,而其整个技术栈是一个渐进式框架。渐进式的含义是:主张最少,也就是可以只用它其中的一部分,有了新的需求后再引入其他的类库。......
  • MySQL进阶实战4,MySQL索引详解,下篇
    一、索引索引是存储引擎用于快速查找记录的一种数据结构。我觉得数据库中最重要的知识点,就是索引。存储引擎以不同的方式使用B-Tree索引,性能也各有不同,各有优劣。例如MyI......