BRVAH(让RecyclerView变得更高效)(1)

本文来自网易云社区

作者:吴思博


对于RecyclerView, 我们重复编写着那一个又一个的列表界面,有的要分组,有的要添加广告头部、有的要不同类型item排列、等等需求,主要代码有大部分是重复的,如果有一个框架能够帮快速的解决各种需求,那该多好。

 

BRVAH是GitHub上一个强大的RecyclerAdapter框架,它能节约开发者大量的开发时间,它集成了大部分列表常用需求解决方案。 该框架于2016年4月10号发布,至今,经历了700多次迭代。


presentation by 吴思博


github:https://github.com/CymChad/BaseRecyclerViewAdapterHelper


official website:www.recyclerview.org

Author(Brvah) blog:http://www.jianshu.com/u/f958e66439f0

 


 

它能干吗?


解放你的双手,让你少码代码!                                                                                      

列表、子布局


一行代码轻松切换5种动画

让你感觉又回到ListView时代!

哼、列表需求来呀!

 

它带来了什么好处?


提高效率

BRVAH 是 Github 上的一个很棒的开源项目,主要作用是帮助我们更加高效的使用 Recyclerview 控件,处理项目中常见需求的 Adapter,使用起来非常方便。

BRVAH 主要是针对 Adapter 来设计的,为我们提供了一般情况下的BaseQuickAdapter,和几个特定需求下的Adapter,BaseMultiItemQuickAdapter用于复杂类布局列表;BaseItemDraggableAdapter 用于拖拽移动和滑动删除类列表; BaseSectionQuickAdapter用于带 Section 头部 View 的列表。


一、框架引入:

b120a1a2-c121-4e80-95bc-c05c24b4a973

二、基本使用

Activity代码:(和普通的一样)

cf050596-5d08-4356-b642-1a81050e6b82

正常的adapter写法:

onCreateViewHolder(这个方法主要生成为每个Item inflater出一个View,方法返回的是一个ViewHolder。 方法是把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,这个ViewHolder需要我们自己去编写。直接省去了当初Listview的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。)和onBindViewHolder(这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView)等方法。

2375df17-e4bb-4370-851a-042883b1554b

使用BRAVH的 Adapter:

首先需要继承BaseQuickAdapter,然后BaseQuickAdapter<T, BaseViewHolder> 中第一个泛型T是数据实体类型,第二个BaseViewHolder是ViewHolder,其目的是为了支持扩展ViewHolder。

6efbcac2-662e-44c9-8c60-de9dea52b9f4

可以通过viewHolder.getView(viewId)获取该控件。 通过viewHolder.getLayoutPosition() 获取当前item的position。(为什么有数据不显示?检查一下的RecyclerView是否设置了LayoutManager。)

代码量是3:1的比例!                                          

和原始的adapter相对,减少了70%的代码量。                      

实现思路:

找到重复部分代码,抽取到基类,非重复部分用抽象方法代替,具体让子类实现。具体代码BaseQuickAdapter如下:(onCreateViewHolder方法和普通adapter一样,对onBindViewHolder方法进行了提取,使用抽象方法convert(抽象方法)代替。)

9968d437-8f75-44f0-9551-1b54e0941e1d

接下来再看看BaseViewHolder怎么写的:( 把ViewHolder进行了封装,利用了 SparseArray,加快了查找已创建好控件的速度,没有创建再使用findviewbyId再存入SparseArray)

08fbeba8-f8fc-4de7-85d9-9477f311274e


b4c0e0d2-e15f-46ab-9f4f-11ec0ba8082d

 

 

三、强大的功能

1. 复杂布局实现(多布局)

在实际应用中经常会遇到各种样式的列表、宫格和列表同时存在、分类列表等情况。

 

1.1 多布局

    在云阅读中的使用:“评论页面”( 优点: 代码量少,节省时间,简洁,清晰,易维护)

22433a1f-fe87-4591-aefc-392a3428f0df

 

 普通多布局写法:

getItemViewType方法,根据位置获取当前item的类型,在onCreateViewHolder 和 onBindViewHolder中匹配类型进行操作。

48cf134f-7d66-4a4f-aefe-c10f4cffadc3

BRAVH是怎么实现?

1、实体类(UserComment)实现MultiItemEntity接口,在设置数据的时候,给每一个数据设置itemType。

c9b02883-c911-4df3-8419-8ac629a4da9d

评论的实体类:

3147b93c-e8e1-439e-84f0-9e26b1953146

2、adapter继承BaseMultiItemQuickAdapter类,在构造方法中调用addItemType()方法加入定义的 itemType 和对应布局, 在 Activity 中实例化即可。

37adcbb9-25b1-4599-9a2f-475a57b5dbcd

和原始的adapter相对,减少70%的代码量,更加清晰易于维护。

原理分析:

0d1747f2-b5b6-4287-88fb-70f9778e2fdc

663931fd-5403-434f-8450-fa36aded34be



网易云免费体验馆,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区。


相关文章:
【推荐】 知物由学|见招拆招,Android应用破解及防护秘籍
【推荐】 工信部公示网络安全示范项目 网易云易盾“自适应DDoS攻击深度检测和防御系统”入选

转载于:https://www.cnblogs.com/163yun/p/9729727.html

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

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

相关文章

校验输入的两次密码是否一致的问题

使用jQuery框架中的validate插件&#xff0c;messages为提示信息。首先导入相应的js文件。 <script src"js/jquery-1.8.2.js"></script> <script src"js/jquery.validate.min.js"></script> <script src"js/messages_zh.…

MySQL自动备份shell脚本

在数据库的日常维护工作中&#xff0c;除了保证业务的正常运行以外&#xff0c;就是要对数据库进行备份&#xff0c;以免造成数据库的丢失&#xff0c;从而给企业带来重大经济损失。通常备份可以按照备份时数据库状态分为热备和冷备&#xff0c;按照备份数据库文件的大小分为增…

“==”和equals()的用法

equals()是java.lang.Object类的方法。 *对于字符串变量来说&#xff1a;”是比较两个对象在内存中的首地址&#xff1b;“equals()”是比较字符串中所包含的内容是否相同。 比如&#xff1a; String s1,s2,s3 "abc", s4 "abc" ; s1 new String("…

PyQt5菜单添加+事件+状态栏-7

1 from PyQt5.QtWidgets import QApplication,QMainWindow,QAction2 from PyQt5.QtGui import QIcon3 #demo_7:菜单添加action以及状态栏显示消息4 import sys5 class Example(QMainWindow):6 def __init__(self):7 self.app QApplication(sys.argv)8 sup…

git命令图片

转载于:https://www.cnblogs.com/duanwandao/p/9734074.html

怎么把JSP的参数:先传到JSP中,然后传给后台

第一种&#xff1a;可以在JSP中使用form表单&#xff0c;把参数放在input中hidden起来&#xff0c;然后在后台中取出来。代码如下&#xff1a; //前台jsp <form action"后台URL" method"post"><input style"display: none" name"…

Power Strings

题目连接 1 #include <stdio.h>2 #include <algorithm>3 #include <string.h>4 using namespace std;5 6 inline int read()7 {8 int x0,f1;char chgetchar();9 while(ch<0||ch>9){if(ch-)f-1;chgetchar();} 10 while(ch>0&&ch…

Content后台的获取为什么为空

在JSP页面中&#xff1a; <s:textarea placeholder"请输入正文" class"bookcontent" name"bookcontent"></s:textarea> 在后台需要获取数据&#xff1a; String bookcontent ServletActionContext.getRequest().getParameter(&q…

将vi打造成IDE

一.环境 发行版:Ubuntu 18.04 LTS 代号:bionic 内核版本:4.15.0-33-generic 二.步骤 2.1 准备工作 sudo apt-get install python3-pip clang cmake python2.7-dev -y pip3 install future frozendict 2.2 获取vundle git clone https://github.com/VundleVim/Vundle.vim.git ~…

解题: SDOI 2011 染色

题面 强行把序列问题通过树剖套在树上。。。算了算是回顾了一下树剖的思想。 每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点&#xff0c;然后拼起来的时候讨论一下拼接点&#xff0c;最后一下左右两边的端点都要考虑 1 #include<cstdio>2 #includ…

decode()、nvl()等用法详解

1、decode( 条件, if1, then1, if2, then2&#xff0c; 缺省值 )&#xff1a; 当条件 1时&#xff0c;则为1&#xff1b;else条件 2时&#xff1b;则为2&#xff1b;都不等时&#xff0c;为缺省值。 2、nvl&#xff08;a , b&#xff09;函数&#xff1a;如果a为NULL&#xf…

java.lang.OutOfMemoryError: PermGen space

使用Tomcat报java.lang.OutOfMemoryError: PermGen space错误时&#xff0c;这是tomcat的内存不够的原因&#xff0c;也就是tomcat的内存溢出。 这是我们只要在tomcat的配置下添加服务内存就可以了&#xff0c;添加内存方法&#xff0c;只要加入 -Xms256M -Xmx512M -XX:PermS…

js继承问题

JavaScript 继承问题 继承的发展史 传统形式 ----> 原型链 继承了父級的所有的属性&#xff08;原型链上的也会继承&#xff09;过多的继承了没有用的属性&#xff0c;代码冗余&#xff0c;执行效率低下子級无法向父級进行传参如果要给之級通过原型来添加属性和方法&#xf…

怎么把jad反编译放到Eclipse中

可以在CSDN下载页上进行下载哦&#xff0c;免费的哦&#xff0c;不要积分。 http://download.csdn.net/detail/farxix/9838195 我们把下载下来的jad资源包解压出来&#xff0c;如下图&#xff1a; 首先&#xff1a; 然后&#xff1a; 打开eclipse进行设置&#xff0…

一些很有意思的JS现象

关于JS对象的 . 和 [] []除了属性名可以比 .天马行空以外(比如我们要添加一个为33-abc的属性&#xff0c;一定得用[]))&#xff0c;还有一个实际操作中的区别 Object.is的作用和两个奇特的现象 还记得isNaN的作用&#xff0c;但有时候我们就想直接比较两个数据&#xff0c;总不…

怎么查看eclipse的版本号

在电脑上找到你安装eclipse的路径&#xff0c;找到readme点击打开&#xff0c;如下图所示&#xff1a; 查看版本号&#xff1a;

asp.net Page.Controls对象(找到所有服务器控件)

前台 复制代码 代码如下:<% Page Language"C#" AutoEventWireup"true" CodeFile"Default.aspx.cs" Inherits"_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3…

Vue2.0 脚手架代码详解

参考作者&#xff1a;https://www.jianshu.com/p/2b661d01eaf8 只是为了方便个人学习。 来看一下脚手架创建后的项目目录 说明&#xff1a;在*.vue文件&#xff0c;template标签里写html代码&#xff0c;且template直接子级只能有一个标签。style标签里写样式&#xff0c;scrip…

如何使用多个端口访问tomcat

查端口号是否被占用 在cmd中使用 netstat -ano 命令&#xff1b; 处理端口号使用命令 taskkill /pid 1234 ( 8080指的是端口号对应的PID 号 ) 在使用tomcat服务器做为开发使用时&#xff0c;如果我们有多个项目要发布、启动时怎么办呢&#xff0c;在一个tomcat下添加多个项目…

设计模式总纲

根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software&#xff08;中文译名&#xff1a;设计模式 - 可复用的面向对象软件元素&#xff09; 中所提到的&#xff0c;总共有 23 种设计模式。这些模式可以分为三大类&#xff1a;创建型模式&…