android listview 滑动条显示_第七十六回:Android中UI控件之RecyclerView基础

各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在前面章回中介绍了ListView组件,今天我们将介绍ListView组件的升级版:RecyclerView组件。之所以叫它升级版本是因为它是官方推出的组件,而且官方推荐使用它来替代ListView组件。它虽然和ListView一样是用来在有限的屏幕空间内滚动显示大量数据,但是它比ListView的显示效率高,因为它每次只创建一个屏幕可以显示的列表,当滑动屏幕时,它自动销毁从屏幕中消失的列表,然后再创建新的列表显示到屏幕中,这样循环往复。细看一下这操作就和它的名字一样,如果和数据结构对比的话,就有点循环队列的意思。接下来我们通过文本结合代码的方式来介绍如何使用RecyclerView组件。

  • 1.在布局文件中添加RecyclerView组件。通常是在Activity或者Fragment的布局文件中添加。添加时需要使用完整包名,因为它是support库中的东西。代码如下:
    <android.support.v7.widget.RecyclerViewandroid:id="@+id/id_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
  • 2.在代码中加载RecyclerView组件的布局。通常是在Activity的onCreate方法或者Fragment的onCreateView方法中加载它的布局,这和普通组件的加载方法相同:
    //获取RecyclerView控件,该控件定义于上面的布局中mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);    
  • 3.设置LayouManager。使用该组件的setLayoutManager方法。代码如下:
     mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
  • 4.创建适配器(Adapter)对象,并且为RecyclerView设置Adapter。具体的代码如下:
    //把Recylerview和adapter关联起来,CustomAdapter稍后介绍mRecyclerView.setAdapter(new CustomAdapter(mData));    

简单起见,在这里的把mData定义成一个数组,在实际中可以依据项目需求来定义。但是不管如何定义,它都要和适配器的构造函数保持一致,不然没有办法把数据传递给适配器。此外,这也是可以进行扩展的地方,我们将在后面章回中介绍,下面是与mData相关的代码:

    private String[] mData = new String[50];for(int i=0; i<50;++i){mData[i]= "This is item "+(i+1);}

接下来该适配器出场了,代码中的CustomeAdapter类是RecyclerView.Adapter的子类,也就是说RecyclerView已经把适配器的规范定义好了,我们只需要按照规范去实现就可以,那么有哪些规范呢?规范主要是实现一个ViewHolder(这个不陌生吧),并且重写onCreateViewHolder()方法,onBindViewHolder()方法和getItemCount。

  1. onCreateViewHolder方法主要是加载布局文件和创建ViewHolder;这里的布局文件指Recycler包含的布局,也就是显示到屏幕中的布局。
  2. onBindViewHolder方法主要是为RecyclerView包含的布局中各个控件添加数据,进而实现数据和视图的连接操作(也可以理解为更新数据)。
  3. getItemCount方法主要是获取RecyclerView中条目的数量,这个数量是指所有数据的数量,而不是在屏幕上显示数据的数量。

下面是代码,不过首先要创建一个布局文件,用来显示RecyclerView中每行或者每列显示的内容,至于布局中显示哪些的内容可以依据项目需求来定。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/id_recy_view_item_text"android:layout_width="wrap_content"android:layout_height="18dp"/>
</LinearLayout>

我们创建了一个叫recycler_view_layout的布局文件,简单起见,我们只放了一个文本组件,用来显示一行文本内容。布局创建好以后,接下就是重头戏:创建适配器。

//注意适配器是泛型
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>{ //自己定义的数据容器,这里使用简单的字符串数组,
//可以是list或者其它容器,容器中的数据类型可以自己定义private String[] mStrings; //定义ViewHolder,继续自RecyclerView的ViewHolderpublic static class CustomViewHolder extends RecyclerView.ViewHolder{//RecyclerView中每一个子项包含的组件,也就是RecyclerView每行或者每列显示的内容public TextView tv; //ViewHolder就是一个数据容器public CustomViewHolder(View v){super(v);//获取RecyclerView中的组件tv =(TextView) v.findViewById(R.id.id_recy_view_item_text);}public TextView getTextView(){return tv;}}//重写适配器的构造器,目的是把数据传入到适配器中public CustomAdapter(String[] strings){if(strings != null) {mStrings = strings;}}@Overridepublic CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//获取View对象,这里的布局就是刚才创建的,看布局id就能明白。//它用来显示Recylerview中具体的列表项View view = LayoutInflater.from(parent.getContext()).inflate (R.layout.recycler_view_layout,parent,false);//创建viewHoldCustomViewHolder customViewHolder = new CustomViewHolder(view); //返回ViewHolderreturn customViewHolder;  }@Overridepublic void onBindViewHolder(CustomViewHolder holder, int position) {//通过position参数获取列表项在Recylerview中的位置,然后更新该位置的数据holder.getTextView().setText(mStrings[position]); }@Overridepublic int getItemCount() {//这个长度比较重要,如果为0,那么recylerview中不会有任何数据显示。return mStrings.length;}
}

上面的代码,完全是按照RecyclerView.Adapter的规范来写的,这和ListView不一样,我们可以自己扩展。另外,我们还创建了一个布局文件,用来显示RecyclerView中每一项的内容,该布局不像ListView一样可以使用系统提供的,因为系统没有提供,只能自己定义。

此外,RecyclerView组件是support库中的东西,它不在SDK中,使用该组件时需要添加支持库,可以手动修改app目录下的build.gradle文件,在dependencies中添加:

compile 'com.android.support:recyclerview-v7:25.1.0'

或者修改项目配置,AST会自动修改gradle文件。修改步骤: AST Menu->File->ProjectStructure->app.

不过添加的Recyclerview组件要和support库的版本一致,不然会出现不兼容的问题。我使用的版本如下:

    compile 'com.android.support:appcompat-v7:25.1.0'compile 'com.android.support:recyclerview-v7:25.1.0'

下面是程序运行的结果,请参考:

v2-cc86b960b482b861fdb3a8e4acf63145_b.jpg

各位看官,关于Android中UI控件之RecyclerView基础的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive的数据模型-外部表

概述 包含External 的表叫外部表 删除外部表只删除metastore的元数据&#xff0c;不删除hdfs中的表数据 外部表 只有一个过程&#xff0c;加载数据和创建表同时完成&#xff0c;并不会移动到数据仓库目录中&#xff0c;只是与外部数据建立一个链接。当删除一个 外部表 时&…

centos默认安装mysql_centos6.x默认安装mysql5.7

1. yum 安装 mysql5.7 yum 源yum localinstall mysql57-community-release-el6-8.noarch.rpm2. 查看是否成功安装MySQL Yum Repositoryyum repolist enabled|grep ""mysql.*-community.*3. 安装mysqlyum install mysql-community-server4.开启数据库服务service mys…

Hive的数据模型-分区表

需求 select * from t1 where xxxx; 这是全表扫描的。实际应用中&#xff0c;有时候不一定需要全表扫描。 比如电信的日志文件&#xff0c;一个表里存了从去年到现在的日志文件&#xff0c;那是很多很大的&#xff0c;实际需求要查今天的&#xff0c;如果用上面的sql&#xf…

arduino 停止程序_建立Arduino机器人,第五部分:障碍规避

欢迎阅读教程系列的第五篇文章&#xff0c;其中我正在构建一个基于遥控Arduino的车辆机器人。这是我到目前为止发表的文章列表&#xff1a;第一部分&#xff1a;硬件组件第二部分&#xff1a;Arduino编程第三部分&#xff1a;组装机器人第四部分&#xff1a;A(不是那样)基本机器…

Yarn简单介绍及内存配置

在这篇博客中&#xff0c;主要介绍了Yarn对MRv1的改进&#xff0c;以及Yarn简单的内存配置和Yarn的资源抽象container。我么知道MRv1存在的主要问题是&#xff1a;在运行时&#xff0c;JobTracker既负责资源管理又负责任务调度&#xff0c;这导致了它的扩展性、资源利用率低等问…

mysql计算时间函数_mysql时间计算函数

当前一个业务需求&#xff0c;需要查找创建在三天以前的数据&#xff0c;表中是存了一个创建时间的&#xff1b;这个需求看起来很简单&#xff0c;直接全部查找出来然后用代码根据时间筛选一下就可以了。但这只是适用于数据量不大的情况下&#xff0c;如果数据量大&#xff0c;…

html上传文件_.NET基于WebUploader大文件分片上传、断网续传、秒传

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;学习中的苦与乐cnblogs.com/xiongze520/p/10412693.html现在的项目开发基本上都用到了上传文件功能&#xff0c;或图片&#xff0c;或文档&#xff0c;或视频。我们常用的常规上传已经能够满足当前要求了&#xff0c;…

Hadoop运行任务时一直卡在: INFO mapreduce.Job: Running job

原文链接&#xff1a;http://blog.csdn.net/dai451954706/article/details/50464036 ----------------------------------------------------------------------------------------------------- 今天&#xff0c;一大清早同事就让我帮他解决Hive的问题&#xff1a;他在Hive中…

git切换用户密码_Git 最基本的命令

本人比较懒&#xff0c;不是很爱学习新东西&#xff0c;之前用Git一直在用GUI SourceTree&#xff0c;今天因为用到Cloud IDEGitHub才迫不得已用一下Git的命令行&#xff0c;如果你是Git的新手&#xff0c;也分享给你最基本的命令。新建一个Git版本库把一个本地文件夹变成一个G…

动态分区装载数据

不开启 一个个分区导入&#xff0c;分区需要做到一对一。 hive (zmgdb)> insert overwrite table p_t3 partition (cityningbo) > select name,post,address from p_t1 where cityningbo; 会启动mapreduce进行导入&#xff0c;mr卡在kill job_xxxx&#…

AI造福设计师:搭配色板这种苦差事交给GAN就好啦(教程)

本文来自AI新媒体量子位&#xff08;QbitAI&#xff09;设计师要开工&#xff0c;总是离不开配色方案&#xff0c;也就是色板。 不过&#xff0c;做色板可不是个简单的活&#xff0c;色板生成器Colormind的作者Jack Qiao&#xff08;名字来自Product Hunt&#xff0c;我们下面叫…

mapreduce yarn内存参数

1、yarn-site.xml 设置 1.1 RM设置 RM的内存资源配置&#xff0c;主要是通过下面的两个参数进行的&#xff08;这两个值是Yarn平台特性&#xff0c;应在yarn-sit.xml中配置好&#xff09;&#xff1a; yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocati…

html网页设计大赛_HTML5网页设计大赛 || 决赛名单公布

历经数日的HTML5网页设计大赛初赛已经落下的帷幕激动人心的决赛即将开始你们准备好了吗&#xff1f;①决赛名单在经过评委老师多轮评选后,有以下队伍/(个人)脱颖而出进入决赛&#xff1a;1.施佳镛_故宫旅游网2.王永校_神秘莫测的宇宙3.黄炜岳_广州旅游网站4.吴贵滨_NameLess5.陈…

Hive的数据模型—桶表

概述 桶表是对数据进行哈希取值&#xff0c;然后放到不同文件中存储。 数据加载到桶表时&#xff0c;会对字段取hash值&#xff0c;然后与桶的数量取模。把数据放到对应的文件中。 物理上&#xff0c;每个桶就是表(或分区&#xff09;目录里的一个文件&#xff0c;一个作业产…

delphi bmp绘制矢量文件效率慢_聊一聊矢量瓦片的常识

一、矢量瓦片的基本原理和相关格式现阶段&#xff0c;电子地图瓦片主要使用两种方式&#xff0c;一种是传统的栅格瓦片&#xff0c;另外一种是新出的矢量瓦片(Vector Tiles)&#xff0c;前者是采用四叉树金字塔模型的分级方式&#xff0c;将地图切割成无数大小相等的矩形栅格图…

python生成器与迭代器。

生成器 在python 中一边循环一边计算的机制&#xff0c;叫做生成器(generator)。 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;收到内存的限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用…

python怎样将list转化成字典_在python 中如何将 list 转化成 dictionary

原标题&#xff1a;在python 中如何将 list 转化成 dictionary 问题1&#xff1a;如何将一个list转化成一个dictionary&#xff1f; 问题描述&#xff1a;比如在python中我有一个如下的list&#xff0c;其中奇数位置对应字典的key&#xff0c;偶数位置为相应的value解决方案: 1…

vscode gcc debug dbg gdb c cpp c++ cuckoo monitor

为什么80%的码农都做不了架构师&#xff1f;>>> 装cygwin 或者mingGW&#xff0c;装gcc工具链&#xff0c;并将cygwin的bin目录加入环境变量PATH中。 ctrlshiftb {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the tasks…

python爬取知网论文关键词_Python爬虫根据关键词爬取知网论文摘要并保存到数据库中...

由于实验室需要一些语料做研究&#xff0c;语料要求是知网上的论文摘要&#xff0c;但是目前最新版的知网爬起来有些麻烦&#xff0c;所以我利用的是知网的另外一个搜索接口 搜索出来的结果和知网上的结果几乎一样 在这个基础上&#xff0c;我简单看了些网页的结构&#xff0c;…

网页中查看pdf文档

2019独角兽企业重金招聘Python工程师标准>>> 介绍&#xff1a; PDFObject 是一个 JavaScript 库&#xff0c;用来在HTML中动态嵌入 PDF 文档。 实现代码&#xff1a; <script type"text/javascript" src"pdfobject.js"></script>…