三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

LoadingStateView源码解析:200行代码如何实现Android视图状态管理的核心原理

LoadingStateView源码解析:200行代码如何实现Android视图状态管理的核心原理

LoadingStateView源码解析:200行代码如何实现Android视图状态管理的核心原理

【免费下载链接】LoadingStateViewDecoupling the code of toolbar or loading status view. (深度解耦标题栏,解耦加载中、加载失败、无数据等缺省页,支持两行代码集成到基类)项目地址: https://gitcode.com/gh_mirrors/lo/LoadingStateView

LoadingStateView是一个轻量级Android库,通过仅200行核心代码实现了视图状态的深度解耦管理。它能帮助开发者轻松处理加载中、加载失败、无数据等缺省页状态,同时支持标题栏与内容区域的解耦,只需两行代码即可集成到项目基类中。

核心设计理念:委托模式实现状态解耦

LoadingStateView的核心设计思想是委托模式,通过将视图创建和状态管理逻辑分离到不同的ViewDelegate中,实现了高度的灵活性和可扩展性。这种设计允许开发者为不同的视图状态(加载中、错误、空数据等)创建独立的委托类,从而避免在Activity或Fragment中编写大量状态判断代码。

核心类结构解析

loadingstateview/src/main/java/com/dylanc/loadingstateview/LoadingStateView.kt文件中,我们可以看到主要包含以下几个核心组件:

  • LoadingStateView:核心管理类,负责视图状态切换和委托管理
  • ViewDelegate:抽象委托类,定义了视图创建和生命周期方法
  • DecorViewDelegate:装饰视图委托,用于添加标题栏等装饰性视图
  • OnReloadListener:重新加载监听器,处理重试逻辑
  • ViewType:枚举类,定义了常见的视图状态类型

核心实现:200行代码的精妙之处

1. 视图容器的动态替换

LoadingStateView的关键在于能够动态替换视图容器中的内容。通过以下代码,它可以将原始ContentView从父容器中移除,并添加一个包含装饰视图和内容区域的新容器:

parent.removeView(contentView) decorView = decorViewDelegate.createDecorView() parent.addView(decorView, index)

这种设计使得我们可以在不修改原始布局的情况下,灵活地添加标题栏、加载状态等装饰性视图。

2. 状态缓存与复用机制

为了提高性能,LoadingStateView实现了视图缓存机制。通过viewCaches哈希表存储已创建的视图,避免频繁的视图创建和销毁:

private fun getOrCreateView(viewType: Any): View { if (viewCaches[viewType] == null) { val viewDelegate = requireNotNull(getViewDelegate(viewType)) val view = viewDelegate.onCreateView(LayoutInflater.from(contentParent.context), contentParent) viewCaches[viewType] = view } return viewCaches[viewType]!! }

3. 简洁的状态切换API

LoadingStateView提供了直观的状态切换方法,使得开发者可以轻松切换不同的视图状态:

fun showLoadingView(animatable: Animatable? = defaultAnimatable) = showView(ViewType.LOADING, animatable) fun showContentView(animatable: Animatable? = defaultAnimatable) = showView(ViewType.CONTENT, animatable) fun showErrorView(animatable: Animatable? = defaultAnimatable) = showView(ViewType.ERROR, animatable) fun showEmptyView(animatable: Animatable? = defaultAnimatable) = showView(ViewType.EMPTY, animatable)

两行代码集成:基类中的应用

LoadingStateView的一大优势是其极简的集成方式。通过Kotlin的委托属性,只需两行代码即可将其集成到Activity或Fragment基类中。

Activity基类集成

如上图所示,在BaseActivity中,只需通过LoadingState by LoadingStateDelegate()委托属性和decorateContentView(this)方法,即可完成集成:

abstract class BaseActivity(private val layoutRes: Int) : AppCompatActivity(), LoadingState by LoadingStateDelegate() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(layoutRes) decorateContentView(this) } }

Fragment基类集成

对于Fragment,集成方式类似,只需在onCreateView方法中返回装饰后的视图:

abstract class BaseFragment(private val layoutRes: Int) : Fragment(), LoadingState by LoadingStateDelegate() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val root = inflater.inflate(layoutRes, container, false) return root.decorate(this) } }

ViewBinding支持

LoadingStateView还提供了对ViewBinding的支持,通过ActivityBinding委托可以更便捷地使用视图绑定:

abstract class BaseBindingActivity<VB : ViewBinding> : AppCompatActivity(), LoadingState by LoadingStateDelegate(), ActivityBinding<VB> by ActivityBindingDelegate() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentViewWithBinding() binding.root.decorate(this) } }

实战应用:自定义视图状态

使用LoadingStateView,开发者可以轻松创建自定义的视图状态。例如,创建一个空数据视图委托:

class EmptyViewDelegate : ViewDelegate(ViewType.EMPTY) { override fun onCreateView(inflater: LayoutInflater, parent: ViewGroup): View { return inflater.inflate(R.layout.layout_empty, parent, false).apply { findViewById<Button>(R.id.btn_reload).setOnClickListener { onReloadListener?.onReload() } } } }

然后在Activity中注册并使用:

register(EmptyViewDelegate(), ErrorViewDelegate()) showEmptyView()

总结:轻量级视图状态管理的最佳实践

LoadingStateView通过不到200行的核心代码,实现了Android视图状态的优雅管理。它的主要优势包括:

  • 低侵入性:通过委托模式实现,不侵入业务代码
  • 高灵活性:支持自定义各种视图状态和装饰视图
  • 易于集成:两行代码即可集成到基类中
  • 性能优化:视图缓存机制避免频繁创建和销毁视图

如果你正在寻找一种简单高效的Android视图状态管理方案,LoadingStateView无疑是一个值得尝试的选择。你可以通过以下命令将其集成到你的项目中:

git clone https://gitcode.com/gh_mirrors/lo/LoadingStateView

通过理解和应用LoadingStateView的设计思想,你不仅可以简化自己项目中的视图状态管理,还能学习到如何通过委托模式和面向接口编程来编写更优雅、更可维护的Android代码。

【免费下载链接】LoadingStateViewDecoupling the code of toolbar or loading status view. (深度解耦标题栏,解耦加载中、加载失败、无数据等缺省页,支持两行代码集成到基类)项目地址: https://gitcode.com/gh_mirrors/lo/LoadingStateView

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表