RecycleView的使用

技术概述

RecycleView是谷歌官方对ListView的改进(并不是替代),在性能和使用体验上都有了较大的改善。在有限大小的空间上,需要呈现出数量不定的内容块,且这些内容块有一定重复性时,一般是让其在可视空间内滚动。我们通常会优先选择RecycleView实现这类功能,例如消息列表、任务视图等

技术详述

在此之前,我们需要知道:

  • RecycleView:一个强大的滚动控件。
  • ViewHolder:容纳和管理view视图,也就是列表里面的一个个子项。使用它可以让代码不必每次都重新创建很多对象,从而使性能大大提示
  • RecycleView.adapter:管理ViewHolder

使用与实现:

一:在界面xml中引入RecycleView,根据需要定制一个小视图的界面(就是需要重复的那一个个子项),然后使用xml文档实现它。

二:实现RecycleView.adapter
一个典型的实现应该是实现了RecycleView.adapter中的三大方法、一个内部类ViewHolder和一个List。例如:

    List<UserItem> musers;

    public static class ViewHolder extends RecyclerView.ViewHolder{}

    @NonNull
@Override
public GridAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {} @Override
public void onBindViewHolder(@NonNull GridAdapter.ViewHolder holder, int position) {} @Override
public int getItemCount() {}

一般来说,list用于存放子项的pojo。onCreateViewHolder用于创建ViewHolder。getItemCount用于告知List的长度(即子项的个数)。onBindViewHolder用于对每个子项执行具体的操作,可以根据position对具体子项对应的实例进行操作,例如点击后数值的改变等,在这里。它会在每个子项滚动到屏幕内的时候执行。

三:引用。首先利用findViewById()实例化RecycleView。然后使用setLayoutManager设置LayoutManager以及使用setAdapter设置adapter。值得一提的是,绝大多数情况下,我们使用LinearLayoutManager,这样呈现的就是常见的线性布局。列举两个特殊一点的:

例如GridLayoutManager ,指定为4列,效果如下:





例如流式布局,这个比较麻烦,建议使用开源控件,我们一般的历史记录,标签等可以用这个实现,效果如下(网图):

可参考流式布局相关资料

四:筛选。如果需要对内容进行筛选,可将适配器继承Filterable接口

extends RecyclerView.Adapter<UserRecyclerViewAdapter.MyViewHolder> implements Filterable

此后需要完成接口要求实现的函数

@Override
public Filter getFilter() { return new Filter() {
//执行过滤操作
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
//执行某些需要的数据过滤操作 ,过滤内容存放在charSequence
} //把过滤后的值返回出来
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
...
notifyDataSetChanged();
}
};
}

再在需要recycleview有过滤的地方引用

Adapter.getFilter().filter(s.toString());

遇到问题和解决

问题一:当在子项中需要获得context时(例如动态添加内容),在adapter中无论是使用getActivity还是getContext,一般情况下是无效的(除非是包含了当前view的引用的函数,那么可以直接利用这个引用的context)。

解决:最简单的解决方法就是在adapter构造函数中加入context形参,使用时需要传入当前的context,这样在adapter的每个需要的地方的可以正常使用需要context的api。

问题二:父视图是RelativeLayout 或者 FrameLayout,无法动态添加控件。

解决:改为或者嵌入LinearLayout。

总结

总的来说,RecycleView是一个常用且功能强大的安卓控件。其高度的解耦性、灵活性赋予了它强大的可拓展性,使得它的视图、业务逻辑的定制和复用更为方便。它很容易上手,但在某些方面却又太过繁琐。因此现在,GitHub上面也有了一些对其进行了一定改造的控件。但这些控件的规范程度、可拓展性还是稍逊一筹的,大部分只适用于特定场合。学会了RecycleView,对于其变形控件的学习也更加方便。

参考文献

Android 控件 RecyclerView

安卓控件RecycleView的简单使用的更多相关文章

  1. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

  2. 抛砖引玉 【镜像控件】 WPF实现毛玻璃控件不要太简单

    原文:抛砖引玉 [镜像控件] WPF实现毛玻璃控件不要太简单 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/articl ...

  3. Android基本控件Spinner的简单使用【转】

    Android基本控件Spinner的简单使用 感谢大佬:https://blog.csdn.net/bingocoder/article/details/80469939 学习过了Textview, ...

  4. [转]通过AngularJS directive对bootstrap日期控件的的简单包装

    本文转自:http://www.cnblogs.com/Benoly/p/4109460.html 最近项目上了AngularJS,而原来使用的日期控件的使用方式也需要改变,于是开始了倒腾,看了官方的 ...

  5. [整理]通过AngularJS directive对bootstrap日期控件的的简单包装

    最近项目上了AngularJS,而原来使用的日期控件的使用方式也需要改变,于是开始了倒腾,看了官方的例子,可以使用AngularJS的directive做简单的处理,这样在html里直接使用申明的的形 ...

  6. jsp日期插件My97DatePicker 强大的日期控件 使用方便简单

    本文属转载(希望对编程爱好者有所帮助)详情请访问官方网站 http://www.my97.net/dp/index.asp 一. 简介 1. 简介 目前的版本是:4.7 2. 注意事项 My97Dat ...

  7. 【2017-05-18】WebForm的Repeater控件和一些简单控件

    一.Repeater控件 1. <%@ %> - 这里面写一些声明和引用的 <%  %> - 编写C#代码的 <%= %> - 往界面上输出一个变量的值 <% ...

  8. Android下拉刷新控件--PullToRefresh的简单使用

    Android中很多时候都会用到上下拉刷新,这是一个很常用的功能,Android的v4包中也为我们提供了一种原生的下拉刷新控件--SwipeRefreshLayout,可以用它实现一个简洁的刷新效果, ...

  9. C#跨线程操作控件的最简单实现探究

    随着程序复杂度的提高,程序不可避免会出现多个线程,此时就很可能存在跨线程操作控件的问题. 跨线程操作UI控件主要有三类方式: 1.禁止系统的线程间操作检查.(此法不建议使用) 2.使用Invoke(同 ...

随机推荐

  1. OO第三单元总结——JML规格

    一.JML简介 1.JML语言的理论基础 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言 (Behavior In ...

  2. Pytorch_Part1_简介&张量

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  3. CRM系统如何改善企业业务流程

    工作流管理是CRM客户管理系统的一个重要功能.当企业进行业务管理和处理时,会有一套自己的工作流程.使用CRM系统,可以帮助企业改进整个工作流程,利用系统的流程设置模块,将各个部门所处理的活动定义为过程 ...

  4. JAVA的基本介绍和JDK的安装

    JAVA帝国 JAVA特性和优势 简单 面向对象 可复制性 高性能 分布式 动态性 多线性 安全性 健壮性 JAVA三大版本 javaSE:标准版(桌面程序.控制台开发) javaME(嵌入式开发) ...

  5. 【转载】有图 KVM折腾记..

    KVM折腾记...https://lengjibo.github.io/KVM%E6%8A%98%E8%85%BE%E8%AE%B0/  Veröffentlicht am 2018-09-20 |  ...

  6. 查看linux系统是多少位,使用 getconf LONG_BIT

    查看linux系统是多少位,使用 getconf LONG_BIT echo $HOSTTYPE

  7. Python基础之PyCharm快捷键大全

    Pycharm中打开Help->Keymap Reference可查看默认快捷键帮助文档 一.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + A ...

  8. shell初学之nginx(负载均衡)

    创建三个以域名区分的网站a.com,b.com,c.com:访问a.b时,分别显示a.b两个网站的内容:访问c时,会出现依次显示两次a网站的内容,一次b网站的内容. 1 #!/bin/bash 2 s ...

  9. 大数据 什么是 ETL

    ETL 概念 ETL 这个术语来源于数据仓库,ETL 指的是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程.ETL 的目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提 ...

  10. 关于Python闭包的一切

    任何把函数当做一等对象的语言,它的设计者都要面对一个问题:作为一等对象的函数在某个作用域中定义,但是可能会在其他作用域中调用,如何处理自由变量? 自由变量(free variable),未在局部作用域 ...