在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Gloading开源软件地址:https://gitee.com/luckybilly/Gloading开源软件介绍:Gloading
演示为Activity添加加载状态
为View添加加载状态
背景Loading动画几乎每个Android App中都有。 一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验。 同样的道理,当加载的数据为空时显示一个数据为空的视图、在数据加载失败时显示加载失败对应的UI并支持点击重试会比白屏的用户体验更好一些。 加载中、加载失败、空数据的UI风格,一般来说在App内的所有页面中需要保持一致,也就是需要做到全局统一。 传统的做法
这种使用方式耦合度太高,每个页面的布局文件中都需要添加 好一点的封装方法
这种封装的好处是通过封装动态地创建 但是,这种封装方式还是存在耦合:页面与它所使用的 如何解耦?梳理一下我们需要实现的效果
2. 确定思路说到View的解耦,很容易联想到Android系统中的AdapterView(我们常用的GridView和ListView都是它的子类)及support包里提供的ViewPager、RecyclerView等,它们都是通过Adapter来解耦的,将自身的逻辑与需要动态变化的子View进行分离。我们也可以按照这个思路来解耦 使用Gloading来解耦Gloading是一个基于Adapter思路实现的深度解耦App中全局LoadingView的轻量级工具(只有一个java文件,不到300行,其中注释占100+行,aar仅6K) 1、 依赖Gloading compile 'com.billy.android:gloading:1.0.0' 2、 创建 Gloading不侵入UI布局,完全由用户自定义 public class GlobalAdapter implements Gloading.Adapter { @Override public View getView(Gloading.Holder holder, View convertView, int status) { GlobalLoadingStatusView loadingStatusView = null; //convertView为可重用的布局 //Holder中缓存了各状态下对应的View // 如果status对应的View为null,则convertView为上一个状态的View // 如果上一个状态的View也为null,则convertView为null if (convertView != null && convertView instanceof GlobalLoadingStatusView) { loadingStatusView = (GlobalLoadingStatusView) convertView; } if (loadingStatusView == null) { loadingStatusView = new GlobalLoadingStatusView(holder.getContext(), holder.getRetryTask()); } loadingStatusView.setStatus(status); return loadingStatusView; } class GlobalLoadingStatusView extends RelativeLayout { public GlobalLoadingStatusView(Context context, Runnable retryTask) { super(context); //初始化LoadingView //如果需要支持点击重试,在适当的时机给对应的控件添加点击事件 } public void setStatus(int status) { //设置当前的加载状态:加载中、加载失败、空数据等 //其中,加载失败可判断当前是否联网,可现实无网络的状态 // 属于加载失败状态下的一个分支,可自行决定是否实现 } }} 3、 初始化 Gloading.initDefault(new GlobalAdapter()); 注:可以用AutoRegister在Gloading类装载进虚拟机时自动完成初始化注册,无需在app层执行注册,耦合度更低 4、在需要使用 //在Activity中显示, 父容器为: android.R.id.contentGloading.Holder holder = Gloading.getDefault().wrap(activity);//需要支持加载失败后点击重试Gloading.Holder holder = Gloading.getDefault().wrap(activity).withRetry(retryTask); or //为某个View显示加载状态//Gloading会自动创建一个FrameLayout,将view包裹起来,LoadingView也显示在其中Gloading.Holder holder = Gloading.getDefault().wrap(view);//需要支持加载失败后点击重试Gloading.Holder holder = Gloading.getDefault().wrap(view).withRetry(retryTask); 5、 使用 //显示加载中的状态,通常是显示一个加载动画holder.showLoading() //显示加载成功状态(一般是隐藏LoadingView)holder.showLoadSuccess()//显示加载失败状态holder.showFailed()//数据加载完成,但数据为空holder.showEmpty()//如果以上默认提供的状态不能满足使用,可使用此方法调用其它状态holder.showLoadingStatus(status) 更多API详情请查看 Gloading JavaDocs 6、 兼容多App场景下的页面、View的复用 每个App的 注:如果使用AutoRegister,则只需在不同App中创建各自的
buildscript { //... dependencies { //... classpath 'com.billy.android:autoregister:使用最新版' }}
apply plugin: 'auto-register'autoregister { registerInfo = [ [ 'scanInterface' : 'com.billy.android.loading.Gloading$Adapter' , 'codeInsertToClassName' : 'com.billy.android.loading.Gloading' , 'registerMethodName' : 'initDefault' ] ]} 开启/关闭Debug模式//设置为true时Logcat会输出日志Gloading.debug(trueOrFalse); 鸣谢Demo中的卡通图片均来自: https://www.thiswaifudoesnotexist.net/ Demo中使用的全局LoadingView图片均取自:https://www.iconfont.cn/ Demo中的特殊Loading动画来自:https://github.com/ldoublem/LoadingView/ |
请发表评论