RecyclerView基本使用

简介: 博客地址背景以前在展示列表时一直都是在使用ListView。唯一的区别大概就是适配器Adapter的不同而已。但是后来接触到了RecyclerView之后,就喜欢上了RecyclerView。

博客地址

背景

以前在展示列表时一直都是在使用ListView。

唯一的区别大概就是适配器Adapter的不同而已。

但是后来接触到了RecyclerView之后,就喜欢上了RecyclerView。

因此本篇打算说下RecyclerView的基本使用,给大家参考下。

正所谓“学以致用”,验明是否掌握了一门东西的最好方法是能够把这个东西讲给别人听,别人还能听懂。

所以基于此,本篇文章应运而生。

RecyclerView的好处

这里我就截取官网上的两段文字来说明。

Many apps need to display user-interface elements based on large data sets, or data that frequently changes. For example, a music app might need to display information about thousands of albums, but only a dozen of those albums might be on-screen at a time. If the app created UI widgets for each of those albums, the app would end up using a lot of memory and storage, potentially making the app slow and crash-prone. On the other hand, if the app created UI widgets each time a new album scrolled onto the screen and destroyed the widgets when it scrolled off, that would also cause the app to run slowly, since creating UI objects is a resource-intensive operation.

To address this common situation, the Android Support Library provides the RecyclerView suite of objects. RecyclerView and its associated classes and interfaces help you to design and implement a dynamic user interface that runs efficiently. You can use these classes as they are, or customize them to suit your specific needs.

传送门

A flexible view for providing a limited window into a large data set.

传送门

简单的说RecyclerView在显示大量数据的时候能起到高效的作用。

实战

前面铺垫了那么多,接下来我们就实际看看一个最简单的RecyclerView如何撰写吧?

首先说明下RecyclerView的几大组成部分:

  • RecyclerView本身
  • 适配器Adapter(下面的例子为MainAdapter)
  • ViewHolder(下面的例子为MainViewHolder)
  • Item布局(下面的例子为item_main.xml)

这四个组成部分依赖关系是Item->ViewHolder->Adapter->RecyclerView

好了,接下来就让我们一步一步来实现一个展示文本的列表。

  1. 添加gradle依赖。在要使用的module的build.gradle文件中加入依赖
compile 'com.android.support:recyclerview-v7:26.+'
  1. 确定列表布局item_main.xml。这里列表展示的就是一个文本,所以只需要一个TextView即可。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/txt_title"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_50"
    android:gravity="center"
    >
</TextView>
  1. 创建列表布局的ViewHolder,继承自RecyclerView.ViewHolder,并初始化列表中的控件。
public class MainViewHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.txt_title)
    TextView mTxtTitle;

    public MainViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }

}

这里使用了butterknife对TextView进行初始化。

  1. 创建适配器Adapter,继承自RecyclerView.Adapter<MainViewHolder> 。将数据源和布局文件通过Adapter联系起来。
public class MainAdapter extends RecyclerView.Adapter<MainViewHolder> {

    private Activity activity;
    private List<String> itemList;

    public MainAdapter(Activity activity, List<String> itemList) {
        if (activity == null || itemList == null) {
            throw new IllegalArgumentException("params can't be null");
        }
        this.activity = activity;
        this.itemList = itemList;
    }

    @Override
    public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main, parent, false);
        return new MainViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MainViewHolder holder, int position) {
        holder.mTxtTitle.setText(itemList.get(position));
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }
}

这里说明下几个方法:

  • 构造函数。用于对数据源进行初始化,以及传递activity进来。
  • onCreateViewHolder。使用item布局来初始化MainViewHolder。
  • onBindViewHolder。通过MainViewHolder获取到具体控件执行对应逻辑。
  • getItemCount。返回数据源的大小。
  1. 创建RecyclerView并进行初始化。

在使用RecyclerView的布局文件中加入下面代码:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false" />

初始化RecyclerView并将其与适配器绑定。

由于这里使用了butterknife,所以创建的时候就初始化了。

@BindView(R.id.recycler_view)
RecyclerView mRecyclerView;
private void initRecyclerView() {
        //设置子视图
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        //添加分割线
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        //设置适配器
        mAdapter = new MainAdapter(this, mItemList);
        mRecyclerView.setAdapter(mAdapter);
    }

如此,一个简单的RecycleView就完成了。


心动不如行动,赶紧自己去敲下代码熟悉下呗~
代码传送门

相关文章
|
存储 供应链 大数据
医院HIS基层卫生健康云综合管理系统源码
护士站: 特点:住院护士站管理系统是住院护理的中心所在,它可实现病房的床位统一管理、医嘱校对、医嘱的执行、医嘱终止、重整医嘱、医嘱查询、健康日志、患者病历首页查询,转科、出院申请,病人在住院期间的信息管理、病房分类管理、对病房、患者信息、患者费用等相关信息的查询。
181 1
|
数据采集 数据挖掘 大数据
数据处理利器:使用Pandas进行数据清洗与转换
【4月更文挑战第12天】在大数据时代,Pandas是Python数据分析的关键工具,提供高效的数据清洗和转换功能。本文介绍了如何使用Pandas处理缺失值(删除或填充)、异常值(Z-Score法和IQR法)以及重复值(检测和删除)。此外,还涵盖了数据转换,包括数据类型转换、数据标准化(Min-Max和Z-Score)以及类别数据的one-hot编码。通过学习这些方法,可以为数据分析和挖掘奠定坚实基础。
381 0
|
SQL 存储 缓存
MySQL是如何保证数据不丢失的?
文章详细阐述了InnoDB存储引擎中Buffer Pool与DML操作的关系。在执行插入、更新或删除操作时,InnoDB为了减少磁盘I/O,会在Buffer Pool中缓存数据页进行操作,随后将更新后的“脏页”刷新至磁盘。为防止服务宕机导致数据丢失,InnoDB采用了日志先行(WAL)机制,通过将DML操作记录为Redo Log并异步刷新到磁盘,结合双写机制和合理的日志刷新策略,确保数据的持久性和一致性。尽管如此,仍需合理配置参数以平衡性能与数据安全性。
340 1
MySQL是如何保证数据不丢失的?
|
12月前
|
数据采集 数据可视化 数据挖掘
Python量化炒股常用的Pandas包
Python量化炒股常用的Pandas包
219 7
|
11月前
|
人工智能
掌握写歌词的技巧和方法,轻松踏上创作之路,妙笔生词AI智能写歌词软件
写歌词是充满魅力与挑战的创作活动。掌握灵感捕捉、主题明确、结构合理和语言生动等关键技巧至关重要。《妙笔生词智能写歌词软件》提供 AI 智能写词、押韵优化、歌词分析等功能,助你轻松创作出优秀的歌词作品,实现音乐梦想。
|
分布式计算 监控 大数据
如何处理 Spark 中的倾斜数据?
【8月更文挑战第13天】
539 4
|
编译器 C语言
C语言中的浮点数:深入探索与应用
C语言中的浮点数:深入探索与应用
1267 1
|
存储 API iOS开发
苹果手机iOS如何使用http代理
我们使用苹果手机访问网络时,有时候需要配置代理服务器。下面就来介绍一下。
苹果手机iOS如何使用http代理
|
机器学习/深度学习 存储 资源调度
python机器学习数据建模与分析——数据预测与预测建模
机器学习的预测建模在多个领域都具有重要的应用价值,包括个性化推荐、商品搜索、自动驾驶、人脸识别等。本篇文章将带领大家了解什么是预测建模
847 0
|
存储 安全 JavaScript
2022完整iOS APP发布App Store上架流程指南
2022完整iOS APP发布App Store上架流程指南
1244 0
2022完整iOS APP发布App Store上架流程指南