vlayout学习笔记

简介: 关于阿里android的UI框架 vlayout的学习笔记
vlayout(VirtualLayout)是阿里开源的一个针对 RecyclerView 的 LayoutManager 扩展,主要提供一整套布局方案和布局间的组件复用。

下面主要简述一下个人读官方文档和实践demo的心得,demo的GitHub地址放在文末,欢迎各位大佬指教~

1.初始化RecycleView,
基于上下文,初始化一个VirtualLayoutManager;

recyclerView.setLayoutManager(layoutManager);

将这个VirtualLayoutManager设置进去recyclerView;

2.利用第一步的VirtualLayoutManager创建一个DelegateAdapter ;

DelegateAdapter delegateAdapter = new DelegateAdapter(layoutManager, hasConsistItemType);

3.1.
准备一个Adapter列表:

List<Adapter> adapterList = new ArrayList<>();

添加(add)各种Adapter,
add的参数即自定义adapter,
这里的自定义adapter是SubAdapter;(代码来自官网demo)

        adapterList.add(new SubAdapter(new LinearLayoutHelper(20), 20));
        adapterList.add(new SubAdapter(new StickyLayoutHelper(true), 1));
        adapterList.add(new SubAdapter(new LinearLayoutHelper(20), 20));
        adapterList.add(new SubAdapter(new GridLayoutHelper(4), 80));
        // adapterList.add(new SubAdapter(new FixLayoutHelper(0, 0), 1));
        adapterList.add(new SubAdapter(new FixLayoutHelper(TOP_RIGHT, 0, 0), 1));

3.2.
自定义adapter的设计:
**注意,
自定义adapter继承自DelegateAdapter.Adapeter,
泛型可以是自定义的ViewHolder;
构造函数一般接收两个参数,
即LayoutHelper以及一个数据参数(用于adapter的数据支持);**

    private static class SubAdapter extends DelegateAdapter.Adapter<SubViewHolder> {

        private LayoutHelper mLayoutHelper;
        private int mItemCount;

        private SubAdapter(LayoutHelper layoutHelper, int itemCount) {
            mLayoutHelper = layoutHelper;
            mItemCount = itemCount;
        }

        @Override
        public LayoutHelper onCreateLayoutHelper() {
            return mLayoutHelper;
        }

        @Override
        public SubViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            return new SubViewHolder(inflater.inflate(R.layout.item, parent, false));
        }

        @Override
        public void onBindViewHolder(SubViewHolder holder, int position) {
            // do nothing
        }

        @Override
        protected void onBindViewHolderWithOffset(SubViewHolder holder, int position, int offsetTotal) {
            super.onBindViewHolderWithOffset(holder, position, offsetTotal);
            holder.setText(String.valueOf(offsetTotal));
            holder.itemView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        }

        @Override
        public int getItemCount() {
            return mItemCount;
        }

    }

对应的ViewHolder设计:

    private static class SubViewHolder extends RecyclerView.ViewHolder {

        public static volatile int existing = 0;
        public static int createdTimes = 0;

        public SubViewHolder(View itemView) {
            super(itemView);
            createdTimes++;
            existing++;
        }

        public void setText(String title) {
            ((TextView) itemView.findViewById(R.id.title)).setText(title);
        }

        @Override
        protected void finalize() throws Throwable {
            existing--;
            super.finalize();
        }
    }

**以上,通过给,
继承自DelegateAdapter.Adapter的自定义Adapter,
设置不同的LayoutHelper,实现了各种各样的布局adapter,
然后我们把这些各种各样的布局adapter,
加入到一个List<Adapter> adapterList中去,
接下来我们把这个adapterList,
设置到delegateAdapter中去:**
delegateAdapter.addAdapters(adapterList);// 不加会 android.content.res.Resources$NotFoundException: Resource ID!!!!

        delegateAdapter.addAdapters(adapterList);
**这里便是VLayout的美妙之处,
我们可以通过继承 DelegateAdapter.Adapter,
创建一个自定义的 Adapter,顺带配备对应的 ViewHolder即 业务容器;
给这个 自定义Adapter的 onCreateLayoutHelper()传入
各种各样的 不同类型的 不同构造形参的 LayoutHelper,
配合传给 自定义Adapter的数据支持参数位,
又可以实现 各种各样的布局效果;
而这些个 各种各样的 不同的布局( adapterList),
又可以加到同一个 delegateAdapter中,
借助 delegateAdapter、 VirtualLayoutManager,
将 各种各样的 这些个布局,
整到同一个 RecycleView中!**

4.最后画龙点睛:

recycler.setAdapter(delegateAdapter);

  • **adapter的设计跟RecycleView的adapter设计差不多,

都是onCreateViewHolder/ViewHolder/onBindViewHolder/getItemCount四部曲罢了:
image.pngimage.png

DelegateAdapter.Adapter无非就是多了个决定布局类型的onCreateLayoutHelper() 方法罢了;**

  • **注意getItemCount可以用来控制显示的数量,

可以是数据List的Size,
也可以通过设定Adapter构造方法,在被调用时通过new过程获取;
其他的就在自定义的Adapter中、在自定义ViewHolder中添加业务逻辑/业务方法函数即可;
比如可以在onBindViewHolder() 的return之前加套if逻辑组,
通过给不同的LayoutHelper设定不同的item颜色等等;**

  • **LayoutHelper实例可以通过Java代码在LayoutHelper层进行UI设计约束;

item层可以通过在adapter.java中用java代码或者在xml中进行UI设计约束;
其中xml记得巧用drawable文件设计:image.png
image.png
**

实战demo的GitHub地址

相关文章
|
Android开发
【RecyclerView】 五、RecyclerView 布局 ( 瀑布流 | 交错网格局管理器 StaggeredGridLayoutManager )
【RecyclerView】 五、RecyclerView 布局 ( 瀑布流 | 交错网格局管理器 StaggeredGridLayoutManager )
1082 0
【RecyclerView】 五、RecyclerView 布局 ( 瀑布流 | 交错网格局管理器 StaggeredGridLayoutManager )
|
小程序 JavaScript Android开发
【经验分享】如何在支付宝小程序里玩转富文本功能
【经验分享】如何在支付宝小程序里玩转富文本功能
1245 6
|
Java 开发工具 git
spring boot 集成 ctrip apollo 实现动态配置更新
spring boot 集成 ctrip apollo 实现动态配置更新
547 1
|
缓存 数据处理 Python
配对堆(Pairing Heap
配对堆(Pairing Heap)是一种优先队列的数据结构,它的主要特点是每个节点都有两个子节点,分别称为左子节点和右子节点。配对堆中每个节点的优先级都大于等于(或小于等于)其子节点的优先级。它具有以下基本操作:插入、删除、查找最小值、更新最小值和堆化。
460 6
RecyclerView GridView模式同一行,使其高度平齐,自动适应高度最大item
RecyclerView GridView模式同一行,使其高度平齐,自动适应高度最大item
997 0
|
人工智能 边缘计算 自然语言处理
大模型应用实践:2025年智能语音机器人厂商推荐和方案详解
随着数字化转型加速,AI客服机器人市场规模预计2025年突破500亿美元,年复合增长率超25%。其发展由语音交互升级、垂直场景解决方案成熟及多模态融合与边缘计算普及三大趋势驱动。文章分析了智能语音机器人的选型核心维度,包括技术性能、场景适配、数据治理与成本效益,并对比了国内外代表厂商如合力亿捷、Zendesk等的方案特点,为企业提供选型策略与落地建议,助力实现服务模式的根本性变革。
1362 0
|
机器学习/深度学习 算法 Python
【Python机器学习】实验10 随机森林和集成学习
【Python机器学习】实验10 随机森林和集成学习
389 0
|
Java
Java强制类型转换需要注意的点
在 Java 中,强制类型转换(显式类型转换)用于将一种数据类型转换为另一种。然而,这一过程需谨慎处理以避免以下问题:数据丢失,尤其是在从大范围类型转换到小范围类型时;类型不兼容,如 `String` 无法直接转换为 `int`;对象类型转换时应确认实际类型与目标类型兼容,可借助 `instanceof` 运算符;处理基本类型与包装类之间的自动装箱和拆箱时需注意 `null` 值;浮点数转整数时会截断小数部分;字符转整数则得到 Unicode 值。充分理解这些注意事项有助于避免运行时错误和数据不一致。
736 16
|
Android开发
DialogFragment 使用指南:几个小问题的解法
DialogFragment是Android中用于创建弹窗的特殊Fragment,继承自Fragment。使用步骤包括:1. 创建子类,2. 在onCreateView加载布局,3. onViewCreated初始化控件,4. 通过show方法显示。示例代码展示了一个基本的DialogFragment及其布局。此外,文中还解答了三个常见问题:如何设置弹窗宽度为match_parent,如何使弹窗位于屏幕底部,以及如何去除弹窗四周的默认padding。每个问题都提供了相应的解决方案,涉及在onStart中调整窗口参数和设置自定义样式。
1984 2
DialogFragment 使用指南:几个小问题的解法
|
XML Java 开发工具
Android Studio开发Android TV
【6月更文挑战第19天】
1007 5

热门文章

最新文章