文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 08:14

关注

介绍

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

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

2016629145409119.png (1391×269)

(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,保留了原来的触摸事件,现在滑动起来舒服多了:

2016629145538569.gif (180×320)

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

您可能感兴趣的文章:深入解析Android中的RecyclerView组件Android App使用RecyclerView实现上拉和下拉刷新的方法Android App开发中使用RecyclerView替代ListView的实践Android RecyclerView布局就这么简单Android开发之RecyclerView控件Android开发中RecyclerView组件使用的一些进阶技讲解


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯