学习安卓开发[3] - 使用RecyclerView显示列表

时间:2022-01-20 23:14:23

在上一篇学习安卓开发[2] - 在Activity中托管Fragment中了解了使用Fragment的好处和方法,本次记录的是在进行列表展示时RecyclerView的使用。

  • RecyclerView介绍
  • RecyclerView及其相关类
  • RecyclerView的应用
    • 引入RecyclerView
    • 关联RecyclerView和fragment
    • ViewHolder
    • Adapter
    • 将Adapter和RecyclerView关联

RecyclerView介绍

很多时候都需要进行列表的展示,比如商品列表,一般的做法是创建一个商品的通用布局,在请求到商品列表数据后,将商品数据转换为商品对象并与一个商品View绑定,这样循环操作就实现了列表的效果。

但如果列表项有很多怎么办呢,如果一次性初始化全部的View很容易搞垮程序。在PC和Web程序中可以使用分页的方式,但如果照搬到运行移动APP的小屏设备体验会非常差。在小屏设备适合上下滑动的方式,那么能否将上下滑动与分页结合,每次只初始化足够一屏显示的view数量呢,答案是肯定的,RecyclerView就是干这个的。

RecyclerView的作用的是按需创建View对象,当View被滑动到屏幕外后,RecyclerView便会将其回收再利用。

RecyclerView及其相关类

要实现这个功能,RecyclerView还需要ViewHolder和Adapter的协助,它们之间的关系为:

学习安卓开发[3] - 使用RecyclerView显示列表

图中没有显示Adapter的位置,实际上它工作在在RecyclerView和ViewHoler之间,负责为RecyclerView提供ViewHoler对象。Adapter是一个控制器对象,从模型层获取数据,然后提供给RecyclerView显示,起动桥梁的作用。

RecyclerView的应用

引入RecyclerView

RecyclerView类来自Google支持库,所以首先需要添加RecyclerView依赖库,这里使用的是recyclerview-v7支持库。然后就可以在列表布局文件中使用它了:

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/crime_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>

注意要给其指定id。

关联RecyclerView和fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_crime_list, container, false); mCrimeRecyclerView = (RecyclerView) view
.findViewById(R.id.crime_recycler_view);
mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); return view;
}

代码使用了setLayoutManager(),因为RecyclerView无法独立工作,需要LayoutManager的支持,RecyclerView在创建完视图后,就立即转交给了LayoutManager,屏幕上列表项的摆放就是LayoutManager负责的,此外它还负责屏幕的滚动行为。

ViewHolder

ViewHolder的职责相对简单,既容纳单个列表项View。基本的ViewHolder使用方式如下,其中list_item_crime为单个列表项View的名称。

private class CrimeHolder extends RecyclerView.ViewHolder{
public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.list_item_crime, parent, false));
}
}

Adapter

在需要显示新创建的ViewHolder或让View对象与已经创建的ViewHolder关联时,RecyclerView会去问Adapter要,RecyclerView工作在较高的抽象层,不会关心具体的View对象,这是Adapter需要做的事。

private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {

    private List<Crime> mCrimes;

    public CrimeAdapter(List<Crime> crimes) {
mCrimes = crimes;
} @Override
public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
return new CrimeHolder(layoutInflater, parent);
} @Override
public void onBindViewHolder(CrimeHolder holder, int position) {
Crime crime = mCrimes.get(position);
holder.bind(crime);
} @Override
public int getItemCount() {
return mCrimes.size();
}
}

将Adapter和RecyclerView关联

编写好了RecyclerView、ViewHoler和Adapter,接下来只需将将Adapter和RecyclerView关联,就可以正常工作了

编写updateUI方法,然后在onCreateView()中,返回view之前调用:

private void updateUI() {
CrimeLab crimeLab = CrimeLab.get(getActivity());
List<Crime> crimes = crimeLab.getCrimes(); mAdapter = new CrimeAdapter(crimes);
mCrimeRecyclerView.setAdapter(mAdapter);
}

学习安卓开发[3] - 使用RecyclerView显示列表的更多相关文章

  1. 学习安卓开发&lbrack;4&rsqb; - 使用隐式Intent启动短信、联系人、相机应用

    在上一篇学习安卓开发[3] - 使用RecyclerView显示列表中了解了在进行列表展示时RecyclerView的使用,本次记录的是在应用中如何通过隐式Intent调用其它应用的功能,比如发短信. ...

  2. 程序员带你学习安卓开发-XML文档的创建与解析

    这是程序员带你学习安卓开发系列教程.本文章致力于面向对象程序员可以快速学习开发安卓技术. 上篇文章:程序员带你学习安卓开发系列-Android文件存储 因知识连贯性推荐关注头条号:做全栈攻城狮.从头开 ...

  3. 学习安卓开发&lbrack;5&rsqb; - HTTP、后台任务以及与UI线程的交互

    在上一篇学习安卓开发[4] - 使用隐式Intent启动短信.联系人.相机应用中了解了在调用其它应用的功能时隐式Intent的使用,本次基于一个图片浏览APP的开发,记录使用AsyncTask在后台执 ...

  4. 学习安卓开发&lbrack;2&rsqb; - 在Activity中托管Fragment

    目录 在上一篇学习安卓开发[1]-程序结构.Activity生命周期及页面通信中,学习了Activity的一些基础应用,基于这些知识,可以构建一些简单的APP了,但这还远远不够,本节会学习如何使用Ac ...

  5. 程序员带你学习安卓开发系列-Android文件存储

    这是程序员带你学习安卓开发系列教程.本文章致力于面向对象程序员可以快速学习开发安卓技术. 上篇文章:.Net程序员快速学习安卓开发-布局和点击事件的写法 主要讲解了布局和点击事件的写法. 上篇文章补充 ...

  6. &period;Net程序员快速学习安卓开发-布局和点击事件的写法

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 本系列课程 致力于老手程序员可以快速入门学习安卓开发.系统全面的从一个.Net程序员的角度一步步学习总结安 ...

  7. 程序员带你学习安卓开发,十天快速入-对比C&num;学习java语法

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  8. 安卓开发:图片的显示Mode

    安卓开发中将图片放置在ImageView中展示,涉及到图片显示的模式,跟iOS开发中UIView的contentMode属性是一个意思,在安卓UI元素中使用的属性是scaleType,其中枚举值的效果 ...

  9. 学习安卓开发&lbrack;1&rsqb; - 程序结构、Activity生命周期及页面通信

    一.程序结构 Android原生应用采用了MVC的架构设计模式,因此可以将一个Android APP中的对象归为Model.View或Controller中的一种. 具体到某个实际的APP结构中,它一 ...

随机推荐

  1. IaaS&comma; PaaS&comma; SaaS 解释

    IaaS.PaaS.SaaS作为云计算三种服务模式,下面会着重介绍他们的定义.作用.功能.对应产品以及他们之间的关系等. 一.定义:     SaaS:Software as a Service,软件 ...

  2. 建立交叉编译环境(arm-linux-gcc)

    linux系统内核版本:2.6.32-358.el6.x86_64(在64位系统上安装32位程序需要另外安装一些库) arm-linux-gcc版本:本文安装的是友善之臂tiny6410光盘中自带的a ...

  3. bzoj1412&colon; &lbrack;ZJOI2009&rsqb;狼和羊的故事

    空地之间开始没有连然后一直WA...题意混乱...尴尬. #include<cstdio> #include<cstring> #include<iostream> ...

  4. RH253读书笔记&lpar;6&rpar;-Lab 6 Implementing Web&lpar;HTTP&rpar; Services

    Lab 6 Implementing Web(HTTP) Services Goal: To implement a Web(HTTP) server with a virtual host and ...

  5. 【Java】【Flume】Flume-NG源代码分析的启动过程(两)

    本节分析配置文件的解析,即PollingPropertiesFileConfigurationProvider.FileWatcherRunnable.run中的eventBus.post(getCo ...

  6. Mac安装Elasticsearch时提示:No Java runtime present&comma; requesting install&period;

    没有安装java的童鞋可以先去安装一下,地址:https://www.java.com/zh_CN/ 安装之后还是提示如下错误: ➜ elasticsearch-2.4.3 bin/elasticse ...

  7. Mysql-表的完整性约束

    一.概述 为了约束用户对数据增,删,改,以确保数据正确,有效,合规. 有以下几种约束 not null 非空 指定某列不能为空 unique 唯一 指定某列或某几列的组合不能重复 primary ke ...

  8. RoR - Introduction to Active Record

    Active Record: ORM ( Object-relational Mapping)Bridges the gap between relational databases , which ...

  9. css:清楚html所有标签自带属性

    相信如果您动手写过网页的话,应该体会到有些标签会自带一些默认的样式,而这些样式或许又是我们不想要的,所以我们可以用以下代码清除所有标签的默认样式   html, body, div, span, ap ...

  10. streaming窗口操作

    之前一直对窗口操作不太理解.认为spark streaming本身已经是分片计算,还需要窗口操作干啥. 窗口操作最为简单易懂的场景就是,在M时间间隔计算一次N时间内的热搜.当M=N的时候,就像上述所说 ...