接着上回,菊花也稍微封装一下
老规矩,上码
一、定义一个菊花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? = null
companion object {
@Volatile
private var sInstance: LoadingManager? = null
fun 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<*>? = null
override 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:我自己瞎搞的,不喜莫喷