PageStatusTransformer:一种Android低

作者: 路人宇 | 来源:发表于2020-04-17 21:22 被阅读0次

    页面状态切换

    PageStatusTransformer.gif

    特性

    • 构造自定义状态
    val transformer =
        PageStatusTransformer.newInstance {
    
            "普通状态" { 
                SimpleStatus(contentView)
            }
    
            "加载中" {
                MyLoadingPageStatus()
            }
    
            "没有数据" {
                MyEmptyPageStatus()
            }
    
            //可以是任意字符串 "StatusName" { 对应的View }
            //或者是任意枚举 Enum { 对应的View }
            "数据错误" {
                MyErrorPageStatus()
            }
        }
        
    //当需要切换状态时,直接切换对应的状态名字:
    transformer.transform("没有数据")
    //或者枚举
    transformer.transform(YourCustomEnum.Status1)
    

    可以通过字符串或枚举自定义任意状态,无须受 showLoading showError 这种死板的接口约束,根据业务场景需要而构造当前页面的状态。

    • 指定替换原来的 View
    PageStatusTransformer.newInstance(
        replaceTo = contentView /*contentView会被替换成同等大小的其他状态的ui*/
    ) { 
        Status1 {...}
        Status2 {...}
    }
    

    通过可选参数 replaceTo 指定原有页面的 View ,当发生状态切换时,新状态的 View 会动态替换旧状态上的 View。所以无须在XML中放一个所谓的 StatusLayout,也无须把业务的状态都塞到 BaseActivity/BaseFragment 中。

    • 支持不同方式的ui切换
    PageStatusTransformer.newInstance(...) { 
        Status1 {
            //`SimpleStatus` 只会改变View的可见性
            //当需要显示这个状态时就Visible,当不需要的时候就Gone
            SimpleStatus(view) 
        }
        Status2 {
            //`ViewStubStatus` 会在状态需要显示时才`inflate`对应的`ViewStub`
            //当不需要的时候就Gone
            ViewStubStatus(viewStub)
        }
        Status3 {
            //`ReplacementViewStatus` 会在状态需要显示时通过 `addView` 添加到布局当中,
            //在状态不需要的时候 `removeView` 移除
            ReplacementViewStatus(view)
        }
    }
    

    支持只改变状态ui的可见性,适用于长期存在于布局中的状态,比如数据正常时的状态。
    支持当使用时才渲染的ViewStub,适用于懒加载布局中的状态。
    支持动态添加和移除状态ui,适用于短暂存在于布局中的临时状态。

    • 自定义状态的ui
    PageStatusTransformer.newInstance(replaceTo = ...) { 
        "状态1" {
            object: PageDisplayStatus {
                override fun showView(){
                    //每次切换到`Status1`时都会触发
                    //完全自定义如何去显示这个状态
                }
                
                override fun hideView(){
                    //每次切换到除`Status1`以外的状态都会触发
                    //完全自定义如何去隐藏这个状态
                }
            }
        }
        "状态2" {
            object: ReplacementViewStatus() {
                override fun inflateView(inflater: LayoutInflater, parent: ViewGroup): View {
                    //切换到`Status2`时触发渲染一个新布局,并动态`addView`到`replaceTo`参数指定的位置
                    return inflater.inflate(...., parent, false)
                }
            
                //每次切换到`Status2`时都会触发
                override fun onViewShow(){...}
    
                //每次切换到除`Status2`以外的状态都会触发
                override fun onViewHide(){...}
            }
        }
        ...
    }
    

    与其他方案对比

    目前项目中使用的API都是类似于 showLoading(@resId int id, String text) ,但新一期需求设计出的loading提示/空数据提示/网络异常提示都是复杂的动画。以前的接口完全不能满足,而且对BaseFragment改动很大。一个本来很小的需求,就影响到接口设计,所以干脆重做了状态切换这一块。
    所以千万不要把这些状态切换代码塞到 BaseFragment 中,千万不要把ui下沉,千万不要二次封装。

    对Java支持

    通过JavaViewStatusBuilder来把弱鸡Java适配到Kotlin DSL:

    PageStatusTransformer transformer = PageStatusTransformer.newInstance(mRecyclerView, 
        new JavaViewStatusBuilder()
            .putStatus("Normal", SimpleStatus(mRecyclerView))
            .putStatus("Empty", YouCustomStatus("暂无数据"))
            .putStatus("Error", YouCustomStatus("网络错误"))
            .putStatus("Loading",YouCustomStatus("加载中"))
            .build()
    );
    
    
    transformer.transform("Empty");
    

    安装

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    
    dependencies {
        implementation 'com.github.YvesCheung:PageStatusTransformer:1.0.0'
    }
    

    相关文章

      网友评论

        本文标题:PageStatusTransformer:一种Android低

        本文链接:https://www.haomeiwen.com/subject/vwuuvhtx.html