android aar项目_Android-我所认知的VLayout
记一次项目中用到的VLayout的使用:
去项目的build里面加上依赖开始撸码吧
implementation('com.alibaba.android:vlayout:1.2.6@aar') {transitive = true
}
至于为什么要加transitive = true
斜眼笑,如果想在使用@aar的前提下还能下载其依赖库,那就老实加上吧,毕竟阿里巴巴给了我们一个@aar……
VirtualLayout是一个针对RecyclerView的LayoutManager扩展, 主要提供一整套布局方案和布局间的组件复用的问题。
第一步当然是最重要的,需要我们去findViewById啦,这里直接上代码:
RecyclerView recyclerView = findViewById(R.id.recyclerView);
然后下一步就有点冲突了,按照阿里巴巴的文档上来看,直接就把RecycledViewPool写出来了,后面又用说明说这个需要对每个Adapter单独使用,直接对recyclerView是不起作用的……心里一万只草泥马奔腾而过。
RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
recyclerView.setRecycledViewPool(viewPool);
第一个参数是对哪一个Adapter设置,第二个则是设置的大小
viewPool.setMaxRecycledViews(0, 30);
然后就是对RecyclerView设置VirtualLayoutManager,这个就是VLayout的核心代码了,能为实际视图提供虚拟的布局,设置VirtualLayoutManager后,将会更改RecycledViewPool。
VirtualLayoutManager layoutManager = new VirtualLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
DelegateAdapter delegateAdapter = new DelegateAdapter(layoutManager, true);
recyclerView.setAdapter(delegateAdapter);
然后就是Adapter需要的各种各样的Helper,这里VLayout提供了以下的Helper
默认通用布局实现,解耦所有的View和布局之间的关系: Linear, Grid, 吸顶, 浮动, 固定位置等。
- LinearLayoutHelper: 线性布局
- GridLayoutHelper: Grid布局, 支持横向的colspan
- FixLayoutHelper: 固定布局,始终在屏幕固定位置显示
- ScrollFixLayoutHelper: 固定布局,但之后当页面滑动到该图片区域才显示, 可以用来做返回顶部或其他书签等
- FloatLayoutHelper: 浮动布局,可以固定显示在屏幕上,但用户可以拖拽其位置
- ColumnLayoutHelper: 栏格布局,都布局在一排,可以配置不同列之间的宽度比值
- SingleLayoutHelper: 通栏布局,只会显示一个组件View
- OnePlusNLayoutHelper: 一拖N布局,可以配置1-5个子元素
- StickyLayoutHelper: stikcy布局, 可以配置吸顶或者吸底
- StaggeredGridLayoutHelper: 瀑布流布局,可配置间隔高度/宽度
上述默认实现里可以大致分为两类:一是非fix类型布局,像线性、Grid、栏格等,它们的特点是布局在整个页面流里,随页面滚动而滚动;另一类就是fix类型的布局,它们的子节点往往不随页面滚动而滚动。
所有除布局外的组件复用,VirtualLayout将用来管理大的模块布局组合,扩展了RecyclerView,使得同一RecyclerView内的组件可以复用,减少View的创建和销毁过程。
如果以上的Helper无法满足自己APP的需求,那么最痛苦的事情就是明明用的第三方,还要自己动手写,这时你的Adapter需要自己继承VirtualLayoutAdapter,然后在去掉头发的手撸各种PM的变态需求吧。
这里只说明常规的Adapter:
public class LinearAdapter extends DelegateAdapter.Adapter<RecyclerView.ViewHolder> {private Context mContext;private LayoutHelper mHelper;private List<String> mData;public LinearAdapter(Context context, List<String> mData, LayoutHelper helper) {this.mContext = context;this.mData = mData;this.mHelper = helper;}@Overridepublic LayoutHelper onCreateLayoutHelper() {return mHelper;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.xxxxxx, parent, false);return new RecyclerViewItemHolder(view);}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {//这里和正常的Adapter处理逻辑一致RecyclerViewItemHolder recyclerViewHolder = (RecyclerViewItemHolder) holder;}@Overridepublic int getItemCount() {return mData.size();}//这个getItemViewType需要单独说明一下,如果自己的特殊样式不存在复用的情况,一定要设置
//唯一的getItemViewType,不然会导致数据错乱,不信的话你可以试试
// @Override
// public int getItemViewType(int position) {
// return super.getItemViewType(position);/或者return 你自己喜欢的数字;
// }/*** 正常条目的item的ViewHolder*/private class RecyclerViewItemHolder extends RecyclerView.ViewHolder {public TextView tv_name;public RecyclerViewItemHolder(View itemView) {super(itemView);//正常的findViewById}}
}
这里需要单独说一下,如果你的需求中有折叠和悬浮布局的话,在CoordinatorLayout+AppBarLayout+Toolbar无法满足的情况下,可以尝试用用这个,效果和代码量是相对于谷歌的折叠布局少的。
最后就是我最新的addAdapter的环节,用VLayout后,就可以add不同样式布局的Adapter,这就很nice,但是add的Adapter需要满足一个条件,那就是需要继承DelegateAdapter.Adapter(这里上面的代码块已经展示出来,就不在贴了),而不是继承RecyclerView.Adapter,或者去继承自己封装的Adapter(当然这里要排除我之前说的特殊情况去继承VirtualLayoutAdapter),这一点是重点。
//Linear 布局
LinearLayoutHelper linearHelper = new LinearLayoutHelper(0);
adapters.add(new LinearAdapter(this, topList, linearHelper));//吸顶的Helper
StickyLayoutHelper stickyHelper = new StickyLayoutHelper();
StickyLayoutAdapter stickyLayoutAdapter = new StickyLayoutAdapter(stickyHelper);
adapters.add(stickyLayoutAdapter);
自己写的adapter的构造器就不说明了,一看就能明白,记得把在adapter的onCreateLayoutHelper方法中去接收helper。上面LinearAdapter有具体代码(我可真懒)
目前我知道的addAdapter的方式有两种,
一、把要加载的adapter放进下面的集合
private final List<DelegateAdapter.Adapter> adapters = new LinkedList<>();
然后加载进入DelegateAdapter。
二、不想单独开集合,那就直接用DelegateAdapter,把所有的adapter直接设置进去,免得忘记把自己写的adapter加载进入DelegateAdapter
牢记自己写的Adapter都逃脱不了DelegateAdapter,逃脱了那就直接显示空白布局了。
貌似知识点就这些了,谢谢各位大佬观看,有问题可以直接提,看到我会回复的。愿所有的需求我们都会,愿所有的产品提需求都带上自己的脑子!!!!
如果还不明白那就去看看
alibaba/vlayout
然后把源码下下来跑跑看,悄悄说一句,这个源码我一直没跑出来,祝福你们能跑出来。
Best Wish!!!!
android aar项目_Android-我所认知的VLayout相关推荐
- android aar项目_介绍如何调试Xamarin.Android的binding项目
背景 Xamarin的开发的一个无法避免的弊端就是在很多Android原生态应用中被普遍用到的库,未必有.NET的实现版本.这个问题就如同当时微软WinPhone失败的原因一样,在另外两个平台中非常普 ...
- android aar项目_一文了解Android游戏SDK开发
去年从平安离职之后,加入了一家游戏公司,负责游戏SDK相关的业务开发和维护工作,经过半年来的摸索,对于游戏SDK的开发有了一定的理解,下面就对游戏SDK开发涉及到的知识点进行简单的梳理. SDK SD ...
- android java项目_Android项目实战 PDF 下载
相关截图: 资料简介: 本书是在<Android 移动开发基础案例教程>的基础上编写的,涵盖 Android 基础的全部 知识,不仅是对 Android 基础的巩固与提高,更是对项目经验的 ...
- android jar包 下载地址,Android Studio项目依赖包下载到本地的jar或aar的路径
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/chenzhengfeng/articl ...
- android简单项目及代码_Android 开源项目 (AOSP) 代码搜索工具正式发布
我们非常高兴的为各位开发者们介绍一个 Android 开源项目 (AOSP) 的代码搜索工具: https://cs.android.com Android 开源项目的代码由一系列 Git 管理的代码 ...
- Android发布项目到外部仓库
为什么80%的码农都做不了架构师?>>> 关于android发布仓库到外部项目的文章,目前大概为分两类: 一种是发布到bintray.jcenter上,一种是将项目上传到git ...
- Android studio 使用Gradle发布Android开源项目到JCenter 总结
1.注册账号 先到https://bintray.com注册一个账号. 这个网站支持 github 账户直接登录的 2.获取 bintray.user 和 bintray.apikey ...
- 【Android AAR】1 分钟不用改任何代码在 Eclipse 中使用 AAR
AAR 是 Google 专门为 Android Studio 推出的一种库文件格式,用于便捷的分享和使用 Android Library 项目 而被 Google 放弃的 Eclipse ADT 没 ...
- Android开源项目分类整理
Android开源项目分类整理 字数1492 分类整理平时收集的项目,便于查找. Android 架构 Mosby A Model-View-Presenter library for modern ...
最新文章
- 一个很不错的开源网站
- DevOps滚动部署
- C++跨类调用——extern
- 用Python做自然语言处理必知的八个工具【转载】
- opencv学习笔记10:阈值分割
- Linux下数据库(sqlite3)学习笔记
- java 扫描类_Java扫描指定包中所有类
- JDK7~13的新特性
- 计算机课怎样制作ppt 课件,如何制作PPT课件视频
- cad详图怎么画_CAD结构图怎么画?手把手教你CAD结构图的绘制方法
- python 求复数的模
- ExpandableListView购物车—+okhttp封装
- 如何下载某些IT培训机构上课视频——可以发送/保存
- php匹配字符串中的url并替换为超链接
- ESD静电保护二极管应用行业举例
- 孤独的日子,往往是你迅速成长的日子
- 史上最完整的5G NR介绍
- 《剑来》语句摘录(三)
- hdu 2097 Java Sky数
- mysql联合索引B 树_B+树和Mysql索引详解
热门文章
- docker删除为none的镜像
- 整合Flask中的目录结构
- Powershell About Active Directory Group Membership of a domain user
- spring中context:property-placeholder/元素
- 64位Ubuntu 13.04 安装Bochs 2.3.5
- idea json转为对象_数据存储—JSON
- Python框架篇之Django(路由系统URL、视图函数views)
- 初学者python笔记(迭代器、生成器、三元表达式、列表解析、send()与yield())
- 03:计算书费【一维数组】
- pythonfor循环if中断怎么使用_如何在for循环中只运行一次if?