最近在学习vlayout,虽然该框架已经没有在维护了,但是在我们的项目中还是在使用的,但是发现在博客上关于vlayout介绍的文章也比较少,刚接触的时候我也是无从下手,因此在看了官网的例子和属性介绍之后,打算写一篇文章来讲一下vlayout的简单使用。(本文是仿官网demo来进行的,但是官网的不是很好理解,有兴趣的同学也可以直接看官网)

vlayout简介

VirtualLayout 是一个针对 RecyclerView 的 LayoutManager 扩展,主要提供一整套布局方案和布局间的组件复用的问题。怎么说呢,就是可以通过一个RecyclerView来实现一个复杂的布局。如下图所示,就比如淘宝的首页可以滑动的区域就是通过vlayout来实现的。

准备工作

在build.gradle文件中导入依赖,这里的版本号可以去官网找最新的。vlayout官网

implementation 'com.alibaba.android:vlayout:1.3.0@aar'

在gradle.properties文件中加上

android.enableJetifier=true

然后准备好布局文件 activity_main.xml。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/main_view"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#aaaaaa"android:clipToPadding="true"android:paddingLeft="0dp"android:paddingRight="0dp"android:requiresFadingEdge="none"android:scrollbars="vertical"/></androidx.constraintlayout.widget.ConstraintLayout>

vlayout的使用

首先先创建一个简单的viewHolder和adapter:

SubAdapter.java:

public class SubAdapter extends DelegateAdapter.Adapter<SubViewHolder> {private LayoutHelper layoutHelper;private int itemCount;public SubAdapter(LayoutHelper layoutHelper, int itemCount) {this.layoutHelper = layoutHelper;this.itemCount = itemCount;}@Overridepublic LayoutHelper onCreateLayoutHelper() {return layoutHelper;}@NonNull@Overridepublic SubViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());return new SubViewHolder(layoutInflater.inflate(R.layout.item, parent, false));}@Overridepublic void onBindViewHolder(@NonNull SubViewHolder holder, int position) {}@Overrideprotected void onBindViewHolderWithOffset(SubViewHolder holder, int position, int offsetTotal) {super.onBindViewHolderWithOffset(holder, position, offsetTotal);holder.setText(String.valueOf(offsetTotal));VirtualLayoutManager.LayoutParams layoutParams = new VirtualLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);holder.itemView.setLayoutParams(new ViewGroup.LayoutParams(layoutParams));}@Overridepublic int getItemCount() {return itemCount;}
}

SubViewHolder.java:

public  class SubViewHolder extends RecyclerView.ViewHolder {public static volatile int existing = 0;public static int createdTimes = 0;public SubViewHolder(@NonNull View itemView) {super(itemView);createdTimes++;existing++;}public void setText(String title) {((TextView) itemView.findViewById(R.id.title)).setText(title);}@Overrideprotected void finalize() throws Throwable {existing--;super.finalize();}
}

以及他们的布局文件item.xml:

<?xml version="1.0" encoding="utf-8"?><FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/title"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:background="#CCCCCC"android:textColor="#999999"android:textSize="22sp"android:textStyle="bold"/>
</FrameLayout>

这个ViewHolder和Adapter的样式可以自定义,这里的话用的是官方demo中的样式。

然后就是activity中进行处理,以下是MainActivity的代码:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);RecyclerView recyclerView = findViewById(R.id.main_view);//1.首先创建一个VirtualLayoutManagerVirtualLayoutManager virtualLayoutManager = new VirtualLayoutManager(this);//2.再创建一个DelegateAdapterDelegateAdapter delegateAdapter = new DelegateAdapter(virtualLayoutManager);//3.创建一个adapterListList<DelegateAdapter.Adapter> adapterList = new ArrayList<>();//4.创建对应的layoutHelper并存放在adapterList中,这里创建了一个LinearLayoutHelper,构造函数中的参数为每个子项的间距LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper(20);//SubAdapter中的参数第一个是对应的layoutHelper,第二个是子item个数adapterList.add(new SubAdapter(linearLayoutHelper, 10));//5.将adapterList作为参数传入delegateAdapterdelegateAdapter.addAdapters(adapterList);recyclerView.setLayoutManager(virtualLayoutManager);recyclerView.setAdapter(delegateAdapter);}
}

这样的话我们就搭建好了一个拥有LinearLayoutHelper的容器了。这个时候运行起来:

就可以得到一个有10个item的一个界面了。

如果我们再在adapterList中添加一个拥有5个item并且间距为40的LinearLayoutHelper会是怎样呢?

//该代码要在delegateAdapter.addAdapters(adapterList);这句之前
LinearLayoutHelper linearLayoutHelper2 = new LinearLayoutHelper(40);
adapterList.add(new SubAdapter(linearLayoutHelper2, 5));

结果如下图:

可以看到又创建了5个item,其中序号第10项到序号第14项之间的间距就为40了 。

小结

那么以上呢就是vlayout的基本使用方式,但是呢,可以看到第9项和第10项之间的是挨在一起的,这个可以通过改变每个helper的属性来进行布局上的变化。如果想了解更多属性的介绍的,可以提前看这个官方文档去了解更多vlayout的属性。当然下篇的话也是会讲这些属性,有兴趣的同学可以点开主页看下篇哈~

vlayout官方属性方法文档https://github.com/alibaba/vlayout/blob/master/docs/ATTRIBUTES-ch.md

vlayout的简单使用上篇(如何搭建一个简单的vlayout)相关推荐

  1. 搭建一个简单的问答系统(v2.0)

    之前刚接触机器学习的时候,写过一篇<基于sklearn库,搭建一个简单的问答系统>.此篇文章是在上篇的逻辑上,对一些函数进行了优化,并对检索方式进行了一些优化,再各个环节上时间复杂度都提高 ...

  2. 用思科网络模拟器搭建一个简单的局域网

    目录 前言 搭建 配置 前言 在搭建一个简单的局域网前,你必须知道一些常识. 网线(双绞)线的标准 T568A标准:白绿.绿.白橙.蓝.白蓝.橙.白棕.棕 T568B标准:白橙.橙.白绿.蓝.白蓝.绿 ...

  3. iris流程图_如何搭建一个简单的机器学习流水线?

    阅读此分步教程,学会通过导入scikit-learn包来搭建一个简单的机器学习流水线(pipeline) 一个机器学习模型中,有很多可移动的组件需要被组合在一起,模型才能被执行并成功的得到结果.把机器 ...

  4. 怎样用python搭建简单的系统_如何用Python搭建一个简单的推荐系统?

    推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...

  5. python旅游推荐系统_如何用Python搭建一个简单的推荐系统?

    推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...

  6. python代理池_用Python搭建一个简单的代理池

    其实每次爬东西的时候,特怕IP被封,所以每次都要把时间延迟设置得长一点...这次用Python搭建一个简单的代理池.获取代理IP,然后验证其有效性.不过结果好像不是很理想,为什么西刺代理的高匿代理都能 ...

  7. 使用SpringBoot搭建一个简单的webSocket服务

    前言 个人地址:使用SpringBoot搭建一个简单的webSocket服务 什么是WebSocket? WebSocket是一个HTML5新增的协议,它的目的在浏览器和服务器之间建立一个不受限的双向 ...

  8. 1-3.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之三

    在1-1.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之一 基础上进行如下操作: 所有路由不能全部都在myDjango下的urls.py路由文件中, ...

  9. 测试开发——搭建一个简单 web服务(flask框架基础)项目实战

    搭建一个简单 web服务-flask框架 一.什么是wsgi? 二.搭建一个简单 web服务 三.扩展 四.请求加参数的情况 五.安装flask 一.什么是wsgi? wsgi是webserver和a ...

  10. SpringBoot + Dubbo + Zookeeper搭建一个简单的分布式服务

    本文使用SpringBoot + Dubbo + Zookeeper 来搭建一个简单的分布式服务 文章目录 dubbo-spring-boot-starter 如何发布 Dubbo 服务 如何消费 D ...

最新文章

  1. 来!一起搭建个永久运行的个人服务器吧!
  2. 使用MySQL组复制的限制和局限性
  3. MongoDB使用小结:一些常用操作分享
  4. oracle 11gr2 bbed 安装,oracle11gR2 装配bbed工具
  5. 数据结构:静态查找动态查找
  6. 关于 SAP Spartacus 服务器端渲染 SSR 无法使用窗口宽度以进行自适应设计的问题
  7. 转载:关于对REST的基本认识和理解
  8. VMware扩展Tanzu产品系列与合作关系
  9. mysql的socket文件_修改socket文件, MySQL启动报错
  10. 15种能力:决定了你的未来能走多远
  11. 【注意】LeetCode 2. Add Two Numbers
  12. Python爬虫实例(含代码)超详细教程
  13. html在线拍照功能,html5实现调用摄像头并拍照功能
  14. 希腊字母表 ← LaTeX
  15. 进程间的通信方式有哪些?
  16. Netron 模型可视化神器,保存好的模型丢进去就能可视化!
  17. 《C专家编程》1-2章阅读收获
  18. 2014522420145238 《信息安全系统设计基础》 第三次实验
  19. 【技术美术图形部分】2.3 HLSL常用函数
  20. 计算机单位怎么解决办法,你单位的电脑坏了,但是之前有通知客户前来办理业务,现在由于系统崩溃,客户怨声载道,你是部门负责人,怎么处理?...

热门文章

  1. 算法 - 快速求一个整数的7倍
  2. 突发!43 岁知名技术大佬当街遇刺身亡,马斯克都怒了!
  3. 高通将推中端和高端芯片反击联发科,关键却在台积电
  4. C++之类型转换函数
  5. linux补充快捷键
  6. 碧桂园拟打造地产、农业、机器人“三驾马车”
  7. 出色的 SQL 编码师成长进阶路线
  8. 多款重磅翻译产品落地之际,我们独家专访了搜狗语音负责人王砚峰
  9. vue基于websocket实现智能聊天及吸附动画效果
  10. 王霸雄图荣华敝屣,谈笑间尽归尘土|基于Python3双队列数据结构搭建股票/外汇交易匹配撮合系统