ViewLoadStatus:更好的办理View 状况
- 支撑 ConstraintLayout 布局
- 支撑 LinearLayout 布局
- 未测试 RelativeLayout 布局
功能展现:
ViewLoadStatus
ViewLoadStatus
是一种用于在现有视图上显现不同加载状况(加载、过错、空)的办法。它会自动根据底层视图的巨细来适应状况视图的巨细和方位。
主要特性:
- 显现各种加载状况:加载、过错、空、完成
- 根据底层视图进行巨细和方位的适配
- 可自界说重试按钮和音讯
- 支撑不同视图类型(默许和 TextView)
类的结构:
- 枚举:
-
VIEW_STATUS
:界说视图的可能状况(加载、过错、空、完成) -
VIEW_TYPE
:指定底层视图的类型(默许或 TextView)
-
- 成员变量
-
viewStatus
:视图的当时状况 -
viewType
:底层视图的类型 -
message
:过错和空状况下显现的音讯 -
paint
:用于制作背景圆角的 Paint 目标 -
onErrorRetryClickListener
:过错状况重试按钮点击的回调 -
onEmptyRetryClickListener
:空状况重试按钮点击的回调 -
currentView
:指向底层视图的引证
-
-
办法:
-
setOnErrorRetryClickListener(click: (v: View) -> Unit)
:设置过错状况重试按钮点击的回调 -
setOnEmptyRetryClickListener(click: (v: View) -> Unit)
:设置空状况重试按钮点击的回调 -
showViewIsLoading(view: View)
:显现加载状况 -
showViewIsError(view: View, msg: String = "加载失利,点击重试")
:显现过错状况,并带有可自界说的音讯 -
showViewEmpty(view: View, msg: String = "什么也没有,点击重试")
:显现空状况,并带有可自界说的音讯 -
finished(view: View)
:躲藏加载状况并显现底层视图 -
getCurrentViewStatus()
:返回当时视图状况 -
getChildSize(view: View)
:获取底层视图的巨细 -
refreshViews()
:根据当时状况更新视图 -
addLoadingView()
:增加加载视图 -
addErrorView()
:增加带有重试按钮的过错视图 -
addEmptyView()
:增加带有重试按钮的空视图 -
dispatchDraw(canvas: Canvas)
:制作背景圆角
-
需求留意以下几点:
- 底层视图的巨细会影响状况视图的巨细和方位。
- 重试按钮的默许背景颜色为赤色,文字为“重试”。能够通过
onErrorRetryClickListener
和onEmptyRetryClickListener
回调来修正重试按钮的点击事件。
运用示例
// 显现加载状况
viewLoadStatus.showViewIsLoading(view)
// 显现过错状况,并带有自界说音讯
viewLoadStatus.showViewIsError(view, "加载失利,请稍后重试")
// 显现空状况,并带有自界说音讯
viewLoadStatus.showViewEmpty(view, "没有数据")
// 躲藏加载状况并显现底层视图
viewLoadStatus.finished(view)
ViewLoadStatusManager
ViewLoadStatusManager 类是一个办理 ViewLoadStatus 的类,它供给了一系列办法来简化 ViewLoadStatus 的运用。
类的主要功能:
- 单例形式: ViewLoadStatusManager 运用了单例形式,确保只要一个实例存在。
- 办理 ViewLoadStatus: 它保护了一个 HashMap,用于存储和办理每个 View 对应的 ViewLoadStatus 目标。
- 加载状况操控: 供给了 loading、error、empty 和 finished 办法来操控 ViewLoadStatus 的状况。
- 重试监听器: 供给了 setOnErrorRetryClickListener 和 setOnEmptyRetryClickListener 办法来设置过错状况和空状况下的重试监听器。
- 获取 ViewLoadStatus 状况: 供给了 getViewLoadStatus 办法来获取某个 View 对应的 ViewLoadStatus 的状况。
类结构:
- 成员变量:
-
viewLoadStatusMap
: 存储 View 和 ViewLoadStatus 对应联系的 HashMap -
viewLoadStatusErrorClickListenerMap
: 存储 View 和 过错状况重试监听器对应联系的 HashMap -
viewLoadStatusEmptyClickListenerMap
: 存储 View 和 空状况重试监听器对应联系的 HashMap
-
- 办法:
-
loading(view: View)
: 显现 View 的加载状况 -
error(view: View)
: 显现 View 的过错状况 -
empty(view: View)
: 显现 View 的空状况 -
finished(view: View)
: 躲藏 View 的加载状况 -
setOnErrorRetryClickListener(view: View, click: (v: View) -> Unit)
: 设置 View 的过错状况重试监听器 -
setOnEmptyRetryClickListener(view: View, click: (v: View) -> Unit)
: 设置 View 的空状况重试监听器 -
getViewLoadStatus(view: View)
: 获取 View 对应的 ViewLoadStatus 的状况
-
运用示例:
val viewLoadStatusManager = ViewLoadStatusManager.init()
// 显现 View 的加载状况
val viewLoadStatus = viewLoadStatusManager.loading(view)
// 设置过错状况重试监听器
viewLoadStatusManager.setOnErrorRetryClickListener(view) {
// 重试操作
}
// 显现 View 的过错状况
viewLoadStatusManager.error(view)
// 躲藏 View 的加载状况
viewLoadStatusManager.finished(view)
留意事项:
- ViewLoadStatusManager 是一个单例类,不要在其他当地创立实例。
- 在调用 ViewLoadStatusManager 的办法之前,需求先初始化它。
- ViewLoadStatusManager 会自动办理 ViewLoadStatus 的生命周期,不需求手动释放资源。
ViewLoadStatusFactory:Kotlin 扩展特点
扩展特点剖析:
-
命名: 每个扩展特点都以
show
开头,后边跟上对应的状况称号,如showLoadingStatus
表明显现加载状况。 -
返回值: 每个扩展特点都返回一个
ViewLoadStatus
目标,该目标能够用于操控状况的显现和躲藏。 -
实现: 每个扩展特点都调用了
ViewLoadStatusManager
的相应办法,并将 View 作为参数传递。
// 显现 View 的加载状况
val viewLoadStatus = view.showLoadingStatus
// 设置过错状况重试监听器
viewLoadStatus.setOnErrorRetryClickListener {
// 重试操作
}
// 设置过错状况重试监听器
view.setOnErrorRetryClickListener{
// 重试操作
}
// 显现 View 的过错状况
view.showErrorStatus
// 躲藏 View 的加载状况
view.showFinishedStatus
长处:
- 简化了 ViewLoadStatus 的运用
- 提高了代码的可读性
- 避免了重复代码
运用教程
不运用扩展函数:
ViewLoadStatus(this).apply {
showViewIsError(binding.cardView)
setOnErrorRetryClickListener {
Toast.makeText(this@MainActivity, "重试", Toast.LENGTH_SHORT).show()
}
}
运用ViewLoadStatusManager
办理状况:
val statusManager = ViewLoadStatusManager.init()
statusManager.empty(binding.cardView)
statusManager.setOnEmptyRetryClickListener(binding.cardView){
Toast.makeText(this@MainActivity, "重试", Toast.LENGTH_SHORT).show()
}
//解除绑定:在生命周期中调用
ViewLoadStatusManager.getInstance().unbindViews(this)
运用Kotlin
扩展函数(引荐):
binding.cardView.showEmptyStatus
binding.cardView.setOnErrorRetryClickListener{
Toast.makeText(this@MainActivity, "过错时", Toast.LENGTH_SHORT).show()
}
binding.cardView.setOnEmptyRetryClickListener{
Toast.makeText(this@MainActivity, "空状况时", Toast.LENGTH_SHORT).show()
}
//解除绑定:在生命周期中调用
binding.root.unbindAllViewStatus
//或者
ViewLoadStatusManager.getInstance().unbindViews(this)
部署
- 下载源代码,复制
View
文件夹下的文件,能够自行更改UI。 - 运用发布版别的 Jar 包导入。
GitHub 地址
欢迎大家纠正