ViewLoadStatus:更好的办理View 状况

  • 支撑 ConstraintLayout 布局
  • 支撑 LinearLayout 布局
  • 未测试 RelativeLayout 布局

功能展现:

ViewLoadStatus:更好的办理View 状况

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 回调来修正重试按钮的点击事件。

运用示例

// 显现加载状况
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 的状况

运用示例:

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 作为参数传递。
// 显现 View 的加载状况
val viewLoadStatus = view.showLoadingStatus
// 设置过错状况重试监听器
viewLoadStatus.setOnErrorRetryClickListener {
    // 重试操作
}
// 设置过错状况重试监听器
view.setOnErrorRetryClickListener{
    // 重试操作
}
// 显现 View 的过错状况
view.showErrorStatus
// 躲藏 View 的加载状况
view.showFinishedStatus

长处:

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

运用教程

不运用扩展函数:

ViewLoadStatus:更好的办理View 状况

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

运用ViewLoadStatusManager办理状况:

ViewLoadStatus:更好的办理View 状况

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扩展函数(引荐):

ViewLoadStatus:更好的办理View 状况

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 项目地址

欢迎大家纠正