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业务容器
给这个 自定义AdapteronCreateLayoutHelper()传入
各种各样不同类型不同构造形参LayoutHelper
配合传给 自定义Adapter的数据支持参数位
又可以实现 各种各样的布局效果
而这些个 各种各样不同的布局adapterList),
又可以加到同一个 delegateAdapter中,
借助 delegateAdapterVirtualLayoutManager
各种各样这些个布局
整到同一个 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 )
1002 0
【RecyclerView】 五、RecyclerView 布局 ( 瀑布流 | 交错网格局管理器 StaggeredGridLayoutManager )
|
存储 Unix Linux
Linux命令历史记录管理:使用history命令提高工作效率
Linux命令历史记录管理:使用history命令提高工作效率
2212 0
|
XML Android开发 数据格式
Android实现ProgressBar旋转菊花加载的动画
Android实现ProgressBar旋转菊花加载的动画 在一些常见到的加载中需要显示一个加载动画,如旋转的菊花这样的动画效果,开发中有两种方案,一种是直接让设计师给出一个gif图片,然后写入到布局,另外一种,使用Android动画,把一张静止的图片动起来,本例用后者实现。
4166 0
couldn't find "libxxxx.so"的解决办法
couldn't find "libxxxx.so"的解决办法
2055 0
|
5月前
|
自然语言处理
主流大模型结构
本文介绍了四大模型架构:Encoder-Decoder、Decoder-Only、Encoder-Only和Prefix-Decoder,涵盖代表模型与应用场景。详解GPT系列演进、LLaMA发展及主流中文大模型,并对比GPT-4、LLaMA-3、Qwen等在架构、参数量与上下文长度等方面的异同。
RecyclerView GridView模式同一行,使其高度平齐,自动适应高度最大item
RecyclerView GridView模式同一行,使其高度平齐,自动适应高度最大item
880 0
|
12月前
|
JavaScript 前端开发 Java
HarmonyOS NEXT~鸿蒙系统下的Cordova框架应用开发指南
《HarmonyOS NEXT:鸿蒙系统下的Cordova框架应用开发指南》详细介绍如何将Cordova应用适配到鸿蒙系统。文章涵盖兼容性分析、环境配置、特性适配、性能优化及发布调试等内容。尽管Cordova官方暂无直接支持,但通过Cordova-Android平台与定制插件可实现功能扩展。开发者需注意性能差异,并借助插件机制融入鸿蒙特色功能,如服务卡片和分布式能力。未来,随着鸿蒙生态完善,Cordova在该平台的应用将更加广泛且高效。
990 1
|
人工智能 自然语言处理 物联网
阿里万相重磅开源,人工智能平台PAI一键部署教程来啦
阿里云视频生成大模型万相2.1(Wan)重磅开源!Wan2.1 在处理复杂运动、还原真实物理规律、提升影视质感以及优化指令遵循方面具有显著的优势,轻松实现高质量的视频生成。同时,万相还支持业内领先的中英文文字特效生成,满足广告、短视频等领域的创意需求。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署阿里万相重磅开源的4个模型,可获得您的专属阿里万相服务。
|
前端开发 Android开发
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
|
存储 JavaScript Java
Cocos Creator Android 平台 Google 原生登录(二)
Cocos Creator Android 平台 Google 原生登录
543 0