vlayout原理分析

2024-02-03 05:48
文章标签 分析 原理 vlayout

本文主要是介绍vlayout原理分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

当我们使用RecylerView时,需要绑定一个Adapter和LayoutManager,而vlayout里定义了VirtualLayoutAdapter(继承自Adapter)和VirtualLayoutManager(继承自LayoutManager)来绑定到RecyclerView。

VirtualLayoutAdapter

它是一个抽象类,很简单:

public abstract class VirtualLayoutAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {@NonNullprotected VirtualLayoutManager mLayoutManager;public VirtualLayoutAdapter(@NonNull VirtualLayoutManager layoutManager) {this.mLayoutManager = layoutManager;}// 设置整个页面一系列的LayoutHelperpublic void setLayoutHelpers(List<LayoutHelper> helpers) {this.mLayoutManager.setLayoutHelpers(helpers);}@NonNull// 获取整个页面一系列的LayoutHelperpublic List<LayoutHelper> getLayoutHelpers() {return this.mLayoutManager.getLayoutHelpers();}}

其中setLayoutHelpers()和getLayoutHelpers()具体实现委托给VirtualLayoutManager来完成。

DelegateAdapter

VirtualLayoutAdapter有一个唯一实现子类DelegateAdapter,顾名思义,它是一个代理的Adapter。我们一般使用vlayout的时候,会给RecyclerView绑定一个VirtualLayoutAdapter,就是这个已经实现好了的DelegateAdapter。

它的作用是什么呢?管理所有的子Adapter(DelegateAdapter.Adapter)
因为我们使用vlayout的时候,将DelegateAdapter和VirtualLayoutManager绑定到RecyclerView之后,要做的事情就是给DelegateAdapter设置一个子Adapter的集合

DelegateAdapter.Adapter

    public static abstract class Adapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {public abstract LayoutHelper onCreateLayoutHelper();protected void onBindViewHolderWithOffset(VH holder, int position, int offsetTotal) {}protected void onBindViewHolderWithOffset(VH holder, int position, int offsetTotal, List<Object> payloads) {onBindViewHolderWithOffset(holder, position, offsetTotal);}}

我们要传递数据集给子Adapter,同时实现onCreateViewHolder(),onBindViewHolder(),getItemCount(),看上去和实现普通的RecyclerView的Adapter一模一样。

当然我们还必须实现onCreateLayoutHelper()这个抽象方法,返回该Adapter对应的LayoutHelper(用于给子Adapter对应的UI模块布局)。

DelegateAdapter的onCreateViewHolder()

    @Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (mHasConsistItemType) {Adapter adapter = mItemTypeAry.get(viewType);if (adapter != null) {return adapter.onCreateViewHolder(parent, viewType);}return null;}// reverse Cantor FunctionCantor.reverseCantor(viewType, cantorReverse);int index = (int)cantorReverse[1];int subItemType = (int)cantorReverse[0];Adapter adapter = findAdapterByIndex(index);if (adapter == null) {return null;}return adapter.onCreateViewHolder(parent, subItemType);}

其中关键的一句就是Adapter adapter = findAdapterByIndex(index);,它会去找到该viewType对应的子Adapter,然后调用对应子Adapter的onCreateViewHolder()。

DelegateAdapter的onBindViewHolder()

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payloads) {super.onBindViewHolder(holder, position, payloads);Pair<AdapterDataObserver, Adapter> pair = findAdapterByPosition(position);if (pair == null) {return;}pair.second.onBindViewHolder(holder, position - pair.first.mStartPosition, payloads);pair.second.onBindViewHolderWithOffset(holder, position - pair.first.mStartPosition, position, payloads);}

这里其实也是去找到了对应的子Adapter,并且调用应子Adapter的onBindViewHolder()。

VirtualLayoutManager

我们在设置子Adapter的时候都会创建对应的LayoutHelper,在给DelegateAdapter设置Adapter的时候,会将LayoutHelper的集合传递给VirtualLayoutManager。

VirtualLayoutManager的作用就是管理LayoutHelper的集合,并且负责RecyclerView的布局

了解过RecyclerView的话,应该就知道RecyclerView执行onLayout()的时候,会调用LayoutManager的onLayoutChildren()。

VirtualLayoutManager的onLayoutChildren()会调用fill(),fill()中又去调用layoutChunk(),其中有这么一句layoutHelper.doLayout(recycler, state, mTempLayoutStateWrapper, result, this);,这里就是找到对应LayoutHelper,让LayoutHelper调用layoutViews()去执行具体的布局。

以上就是对vlayout的原理分析,关于vlayout的概述可以参考带你学习阿里巴巴的开源库VLayout。

这篇关于vlayout原理分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/673144

相关文章

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO