接着上回,菊花也稍微封装一下
老规矩,上码
一、定义一个菊花interface,真正实现菊花的接口类
open interface ILoading {/*** 获取加载服务*/fun getLoad(): Any?/*** 注册目标view*/fun register(target: Any)/*** 注册目标view*/fun register(target: Any, onLoadSirListener: OnReloadListener)/*** 显示|隐藏菊花(不覆盖目标view)*/fun showLoadingView(show: Boolean)/*** 显示|隐藏菊花(覆盖目标view)*/fun showLoadingCoverView(show: Boolean)/*** 显示动画view*/fun showAnimateView()/*** 显示错误view*/fun showErrorView()/*** 显示空view*/fun showEmptyView()
}
二、再定义一个菊花代理interface
interface LoadingInterface {fun initLoading(): ILoading?}
三、实现菊花代理接口
class LoadingManager : LoadingInterface {private var delegateInterface: LoadingInterface? = nullcompanion object {@Volatileprivate var sInstance: LoadingManager? = nullfun get(): LoadingManager {if (sInstance == null) {synchronized(LoadingManager::class.java) {if (sInstance == null) {sInstance = LoadingManager()}}}return sInstance!!}}fun init(delegateInterface: LoadingInterface) {if (this.delegateInterface != null) {FLogUtils.w("多次初始化菊花!!--请检查代码")return}this.delegateInterface = delegateInterface}override fun initLoading(): ILoading? {if (delegateInterface == null) {FLogUtils.w("未初始化菊花--请实现LoadingInterface接口,并调用LoadSirManager.init进行初始化")}return delegateInterface?.initLoading()}}
换汤不换要,也是静态代理。
四、再加上一个重新加载的接口,基本上 基础接口方法都差不多了
interface OnReloadListener {fun onReload(v: View?)
}
五、接下来就是各个接口的实现了,首先是菊花实现ILoadingImpl
class ILoadingImpl : ILoading {private var loadService: LoadService<*>? = nulloverride fun getLoad(): LoadService<*>? {return loadService}override fun register(target: Any) {loadService = LoadSir.getDefault().register(target)}override fun register(target: Any,onReloadListener: OnReloadListener) {loadService = LoadSir.getDefault().register(target) {onReloadListener.onReload(it)}}override fun showLoadingView(show: Boolean) {loadService?.showCallback(if (show) LoadingCallback::class.java else SuccessCallback::class.java)}override fun showLoadingCoverView(show: Boolean) {loadService?.showCallback(if (show) LoadingCoverCallback::class.java else SuccessCallback::class.java)}override fun showAnimateView() {loadService?.showCallback(AnimateCallback::class.java)}override fun showErrorView() {loadService?.showCallback(ErrorCallback::class.java)}override fun showEmptyView() {loadService?.showCallback(EmptyCallback::class.java)}}
这里利用LoadSir库来实现菊花
六、实现菊花代理LoadSirDelegateImpl
class LoadSirDelegateImpl : LoadingInterface {override fun initLoading(): ILoading? {return ILoadingImpl()}
}
七、最后就是菊花配置了
object LoadSirExt {/*** 初始化* @param loadSirLayoutInterface 实现接口可自定义callback布局*/fun init(loadSirLayoutInterface: LoadSirLayoutInterface? = null) {configLoadSir()LoadSirSimpleLayout.get().init(loadSirLayoutInterface)LoadingManager.get().init(LoadSirDelegateImpl())}/*** 配置LoadSir*/private fun configLoadSir() {LoadSir.beginBuilder().addCallback(ErrorCallback()).addCallback(EmptyCallback()).addCallback(AnimateCallback()).addCallback(LoadingCallback()).addCallback(LoadingCoverCallback()).setDefaultCallback(SuccessCallback::class.java).commit()}
}
这里的LoadSirLayoutInterface 其实也是通过静态代理,自定义LoadSir的各种布局,此处就不贴代码了
这样菊花与BaseActivity也封装好了。
稍微总结一下:
都是利用代理,来实现封装、扩展。 没什么技术含量,就是基本的封装。
一、这些类可以封装成一个base库
1、BaseActivity
2、DispenseToolbar、DispenseToolbarInterface、DispenseToolbarStyle、DispenseToolbarStyleDelegate
3、ILoading、LoadingInterface、LoadingManager、OnReloadListener
二、另外可以把菊花也封装成一个库,如这里利用LoadSir加以封装
1、ILoadingImpl、LoadSirDelegateImpl、LoadSirExt、LoadSirLayoutInterface
我们这样简单封装过后,撸起来也方便,扩展起来也方便
ps:我自己瞎搞的,不喜莫喷