记一次项目中用到的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相关推荐

  1. android aar项目_介绍如何调试Xamarin.Android的binding项目

    背景 Xamarin的开发的一个无法避免的弊端就是在很多Android原生态应用中被普遍用到的库,未必有.NET的实现版本.这个问题就如同当时微软WinPhone失败的原因一样,在另外两个平台中非常普 ...

  2. android aar项目_一文了解Android游戏SDK开发

    去年从平安离职之后,加入了一家游戏公司,负责游戏SDK相关的业务开发和维护工作,经过半年来的摸索,对于游戏SDK的开发有了一定的理解,下面就对游戏SDK开发涉及到的知识点进行简单的梳理. SDK SD ...

  3. android java项目_Android项目实战 PDF 下载

    相关截图: 资料简介: 本书是在<Android 移动开发基础案例教程>的基础上编写的,涵盖 Android 基础的全部 知识,不仅是对 Android 基础的巩固与提高,更是对项目经验的 ...

  4. android jar包 下载地址,Android Studio项目依赖包下载到本地的jar或aar的路径

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/chenzhengfeng/articl ...

  5. android简单项目及代码_Android 开源项目 (AOSP) 代码搜索工具正式发布

    我们非常高兴的为各位开发者们介绍一个 Android 开源项目 (AOSP) 的代码搜索工具: https://cs.android.com Android 开源项目的代码由一系列 Git 管理的代码 ...

  6. Android发布项目到外部仓库

    为什么80%的码农都做不了架构师?>>>    关于android发布仓库到外部项目的文章,目前大概为分两类: 一种是发布到bintray.jcenter上,一种是将项目上传到git ...

  7. Android studio 使用Gradle发布Android开源项目到JCenter 总结

    1.注册账号 先到https://bintray.com注册一个账号.  这个网站支持 github 账户直接登录的 2.获取  bintray.user  和 bintray.apikey      ...

  8. 【Android AAR】1 分钟不用改任何代码在 Eclipse 中使用 AAR

    AAR 是 Google 专门为 Android Studio 推出的一种库文件格式,用于便捷的分享和使用 Android Library 项目 而被 Google 放弃的 Eclipse ADT 没 ...

  9. Android开源项目分类整理

    Android开源项目分类整理 字数1492 分类整理平时收集的项目,便于查找. Android 架构 Mosby A Model-View-Presenter library for modern ...

最新文章

  1. 一个很不错的开源网站
  2. DevOps滚动部署
  3. C++跨类调用——extern
  4. 用Python做自然语言处理必知的八个工具【转载】
  5. opencv学习笔记10:阈值分割
  6. Linux下数据库(sqlite3)学习笔记
  7. java 扫描类_Java扫描指定包中所有类
  8. JDK7~13的新特性
  9. 计算机课怎样制作ppt 课件,如何制作PPT课件视频
  10. cad详图怎么画_CAD结构图怎么画?手把手教你CAD结构图的绘制方法
  11. python 求复数的模
  12. ExpandableListView购物车—+okhttp封装
  13. 如何下载某些IT培训机构上课视频——可以发送/保存
  14. php匹配字符串中的url并替换为超链接
  15. ESD静电保护二极管应用行业举例
  16. 孤独的日子,往往是你迅速成长的日子
  17. 史上最完整的5G NR介绍
  18. 《剑来》语句摘录(三)
  19. hdu 2097 Java Sky数
  20. mysql联合索引B 树_B+树和Mysql索引详解

热门文章

  1. docker删除为none的镜像
  2. 整合Flask中的目录结构
  3. Powershell About Active Directory Group Membership of a domain user
  4. spring中context:property-placeholder/元素
  5. 64位Ubuntu 13.04 安装Bochs 2.3.5
  6. idea json转为对象_数据存储—JSON
  7. Python框架篇之Django(路由系统URL、视图函数views)
  8. 初学者python笔记(迭代器、生成器、三元表达式、列表解析、send()与yield())
  9. 03:计算书费【一维数组】
  10. pythonfor循环if中断怎么使用_如何在for循环中只运行一次if?