ViewLoadStatus:更好的管理View 状态

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):绘制背景圆角

需要注意以下几点:

  • 底层视图的大小会影响状态视图的大小和位置。
  • 重试按钮的默认背景颜色为红色,文字为"重试"。可以通过 onErrorRetryClickListeneronEmptyRetryClickListener 回调来修改重试按钮的点击事件。

使用示例

kotlin 复制代码
// 显示加载状态
viewLoadStatus.showViewIsLoading(view)

// 显示错误状态,并带有自定义消息
viewLoadStatus.showViewIsError(view, "加载失败,请稍后重试")

// 显示空状态,并带有自定义消息
viewLoadStatus.showViewEmpty(view, "没有数据")

// 隐藏加载状态并显示底层视图
viewLoadStatus.finished(view)

ViewLoadStatusManager

ViewLoadStatusManager 类是一个管理 ViewLoadStatus 的类,它提供了一系列方法来简化 ViewLoadStatus 的使用。

类的主要功能:

  1. 单例模式: ViewLoadStatusManager 使用了单例模式,保证只有一个实例存在。
  2. 管理 ViewLoadStatus: 它维护了一个 HashMap,用于存储和管理每个 View 对应的 ViewLoadStatus 对象。
  3. 加载状态控制: 提供了 loading、error、empty 和 finished 方法来控制 ViewLoadStatus 的状态。
  4. 重试监听器: 提供了 setOnErrorRetryClickListener 和 setOnEmptyRetryClickListener 方法来设置错误状态和空状态下的重试监听器。
  5. 获取 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 的状态

使用示例:

kotlin 复制代码
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 扩展属性

扩展属性分析:

  1. 命名: 每个扩展属性都以 show 开头,后面跟上对应的状态名称,如 showLoadingStatus 表示显示加载状态。
  2. 返回值: 每个扩展属性都返回一个 ViewLoadStatus 对象,该对象可以用于控制状态的显示和隐藏。
  3. 实现: 每个扩展属性都调用了 ViewLoadStatusManager 的相应方法,并将 View 作为参数传递。
kotlin 复制代码
// 显示 View 的加载状态
val viewLoadStatus = view.showLoadingStatus

// 设置错误状态重试监听器
viewLoadStatus.setOnErrorRetryClickListener {
    // 重试操作
}

// 设置错误状态重试监听器
view.setOnErrorRetryClickListener{
    // 重试操作
}

// 显示 View 的错误状态
view.showErrorStatus

// 隐藏 View 的加载状态
view.showFinishedStatus

优点:

  • 简化了 ViewLoadStatus 的使用
  • 提高了代码的可读性
  • 避免了重复代码

使用教程

不使用扩展函数:

kotlin 复制代码
ViewLoadStatus(this).apply {
    showViewIsError(binding.cardView)
    setOnErrorRetryClickListener {
        Toast.makeText(this@MainActivity, "重试", Toast.LENGTH_SHORT).show()
    }
}

使用ViewLoadStatusManager管理状态:

kotlin 复制代码
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扩展函数(推荐):

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)

部署

  1. 下载源代码,复制 View文件夹下的文件,可以自行更改UI。
  2. 使用发布版本的 Jar 包导入。

GitHub 地址

git 项目地址

欢迎大家纠正

相关推荐
Estar.Lee3 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
温辉_xh3 小时前
uiautomator案例
android
工业甲酰苯胺5 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
少说多做3435 小时前
Android 不同情况下使用 runOnUiThread
android·java
Estar.Lee6 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
找藉口是失败者的习惯7 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
Jinkey8 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
大白要努力!10 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟11 小时前
Android音频采集
android·音视频
小白也想学C12 小时前
Android 功耗分析(底层篇)
android·功耗