Loading加载页面
一般页面有四种情况
加载中 :就是滚动页面,后台获取加载的数据,每个页面的数据不同所以就让子类来实现,直接抽象abstract了。
加载失败 :一般都需要点击后重新加载
空页面 :也需要点击后重新加载
加载成功 :显示成功的页面,每个页面都不同所以让子类实现,那必须是抽象的 abstract了
我采取的是每个页面都是framelayout来显示 加载的页面。一共有四个页面。通过加载的数据返回来的 状态 进而让页面显示相应的动画
先屡一下思路
1 先加载三个页面,开始都执行loading页面
2 加载数据, 用到了线程池处理耗时炒作,具体如何访问网络让子类来实现判断数据是否可用
3 数据可用显示 成功界面
数据不可用显示 加载失败页面
数据的list比如为0 加载空页面
package com.example.every_text.view; import com.wang.cn.manager.ThreadManager;
import com.wang.cn.utils.UIUtils; import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout; /**
* 先加顺序 load -->showPagerView-->createSuccessView
*在子类中 耗时操作放到 load中,然后load返回一个状态,在showPagerView中根据状态选择 显示的页面
*如果装在是成功的。那么久显示 createSuccessView
*/
public abstract class LoadingPager extends FrameLayout { // 加载默认的状态
private static final int STATE_UNLOADED = ;
// 加载的状态
private static final int STATE_LOADING = ;
// 加载失败的状态
private static final int STATE_ERROR = ;
// 加载空的状态
private static final int STATE_EMPTY = ;
// 加载成功的状态
private static final int STATE_SUCCEED = ; private View mLoadingView;// 转圈的view
private View mErrorView;// 错误的view
private View mEmptyView;// 空的view
private View mSucceedView;// 成功的view private int mState;// 默认的状态 private int loadpage_empty;
private int loadpage_error;
private int loadpage_loading; public LoadingPager(Context context, int loading, int error, int empty) {
super(context);
loadpage_empty = empty;
loadpage_error = error;
loadpage_loading = loading;
init();
} public LoadingPager(Context context, AttributeSet attrs, int defStyle,
int loading, int error, int empty) {
super(context, attrs, defStyle);
loadpage_empty = empty;
loadpage_error = error;
loadpage_loading = loading;
init();
} public LoadingPager(Context context, AttributeSet attrs, int loading,
int error, int empty) {
super(context, attrs); init();
}
private void init() {
// 初始化状态
mState = STATE_UNLOADED;
// 初始化三个 状态的view 这个时候 三个状态的view叠加在一起了
mLoadingView = createLoadingView();
if (null != mLoadingView) {
addView(mLoadingView, new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
}
mErrorView = createErrorView();
if (null != mErrorView) {
addView(mErrorView, new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
}
mEmptyView = createEmptyView();
if (null != mEmptyView) {
addView(mEmptyView, new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
}
showSafePagerView();
}
private void showSafePagerView() {
// 直接运行到主线程
UIUtils.runInMainThread(new Runnable() {
@Override
public void run() {
showPagerView();
}
});
}
private void showPagerView() { // 這個時候 都不為空 mState默認是STATE_UNLOADED狀態所以只顯示 lodaing 下面的 error
// 和empty暂时不显示
if (null != mLoadingView) {
mLoadingView.setVisibility(mState == STATE_UNLOADED
|| mState == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);
}
if (null != mErrorView) {
mErrorView.setVisibility(mState == STATE_ERROR ? View.VISIBLE
: View.INVISIBLE);
}
if (null != mEmptyView) {
mEmptyView.setVisibility(mState == STATE_EMPTY ? View.VISIBLE
: View.INVISIBLE);
} if (mState == STATE_SUCCEED && mSucceedView == null) {
mSucceedView = createSuccessView();
addView(mSucceedView, new LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
if (null != mSucceedView) {
mSucceedView.setVisibility(mState == STATE_SUCCEED ? View.VISIBLE : View.INVISIBLE);
}
}
public void show() {
// 第一次进来肯定要 转圈的 所以就算是 error和empty 也要让状态是 unload
if (mState == STATE_ERROR || mState == STATE_EMPTY) {
mState = STATE_UNLOADED;
}
// 如果是unload 就把状态 变为 loading了 这时候从服务器拿数据
if (mState == STATE_UNLOADED) {
mState = STATE_LOADING; TaskRunnable task = new TaskRunnable();
ThreadManager.getLongPool().execute(task);
}
showSafePagerView();
}
/**
* 制作界面
*
* @return
*/
protected abstract View createSuccessView(); /**
* 处理下载 耗时操作
*
* @return
*/
protected abstract LoadResult load(); /**
* 空界面
*
* @return
*/
public View createEmptyView() {
if (loadpage_empty != ) {
return UIUtils.inflate(loadpage_empty);
}
return null; } /**
* 失败的页面
*
* @return
*/
public View createErrorView() {
if (loadpage_empty != ) {
return UIUtils.inflate(loadpage_error);
}
return null;
} /**
* 正在旋转的页面
*
* @return
*/
public View createLoadingView() {
if (loadpage_empty != ) {
return UIUtils.inflate(loadpage_loading);
}
return null;
} class TaskRunnable implements Runnable {
@Override
public void run() {
final LoadResult loadResult = load();
SystemClock.sleep();
UIUtils.runInMainThread(new Runnable() {
@Override
public void run() {
mState = loadResult.getValue();
showPagerView();
}
});
}
}
public enum LoadResult {
ERROR(), EMPTY(), SUCCESS();
int value; LoadResult(int value) {
this.value = value;
} public int getValue() {
return value;
}
}
}
package com.wang.cn.base; import com.example.every_text.view.LoadingPager;
import com.example.every_text.view.LoadingPager.LoadResult;
import com.wang.cn.R;
import com.wang.cn.utils.UIUtils; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener; /**
* @version 创建时间:2015年7月8日 上午11:31:11 类说明 activity的基类
*/
public abstract class BaseActivity extends Activity {
public LoadingPager loadingPage; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); loadingPage = new LoadingPager(UIUtils.getContext(),
R.layout.loadpage_loading, R.layout.loadpage_error,
R.layout.loadpage_empty)//加载了三个页面
{
@Override
protected LoadResult load() {
return BaseActivity.this.load();//传递给子类
}
@Override
protected View createSuccessView() {
return BaseActivity.this.createSuccessView();//传递给子类
}
};
// 可以点击
loadingPage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
loadingPage.show();
}
});
// 显示 loading的页面
loadingPage.show();
setContentView(loadingPage);
} /**
* 刷新页面工程
*
* @return
*/
protected abstract View createSuccessView(); /**
* 请求服务器 获取当前状态
*
*/
protected abstract LoadResult load(); }
package com.wang.cn; import android.content.Intent;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView; import com.example.every_text.view.LoadingPager.LoadResult;
import com.wang.cn.base.BaseActivity;
import com.wang.cn.utils.UIUtils;
import com.wang.cn.utils.ViewUtils; /**
* @version 创建时间:2015年7月8日 上午11:31:11 类说明 主函数
*/
public class MainActivity extends BaseActivity {
// 刷新页面工程
@Override
protected View createSuccessView() {
View inflate = UIUtils.inflate(R.layout.activity_main); TextView tv=ViewUtils.findViewById(inflate, R.id.textView1);
tv.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent intent=new Intent(UIUtils.getContext(),FragmetActivity.class);
startActivity(intent);
}
});
return inflate;
} // 刷新页面工程
@Override
protected LoadResult load() {
SystemClock.sleep();
return LoadResult.SUCCESS;
}
}
Loading加载页面的更多相关文章
- android 应用架构随笔六(Loading加载页面)
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.heima ...
- 基于jquery实现页面loading加载效果
实现loading 加载提示 ······ 透明遮罩 居中效果 具体代码如下: CSS样式部分: <style type="text/css"> .background ...
- 使用Dialog实现全局Loading加载框
Dialog实现全局Loading加载框 很多人在实现Loading加载框的时候,都是在当前的页面隐藏一个Loading布局,需要加载的时候,显示出来,加载完再隐藏 使用Dialog实现Loading ...
- vue+elementUI+axios实现的全局loading加载动画
在项目中,很多时候都需要loading加载动画来缓解用户的焦虑等待,比如说,我打开了一个页面,而这个页面有很多接口请求,但浏览器的请求并发数就那么几个,再加上如果网速不行的话,那么这时候,用户很可能就 ...
- flutter 入口文件配置路由+加载页面
入口文件配置路由 1.路由信息 -- 加载页面 ,通常用于显示新的内容或者广告,加载完成之后进入主页面 -- 主页面 /app 2.配置页面 main.dart main.dart // main ...
- ajax请求完之前的loading加载
很多时候我们需要引入框架来开发项目,这时我们可能会遇到页面还没加载完源码出来了的问题,给用户一种不好的视觉体验,这是便需要loading加载了,来完善用户体验! /*loading.js*/ // 加 ...
- loading加载和layer.js
layer.js中的loading加载 l本篇主要介绍layerjs中的loading加载在实际项目中的应用 1.使用的技术 前端:HTML5+CSS3+JS+layer.js 后端:.net 2.遇 ...
- APP的六种loading加载样式,全在这...
今天这篇文章是给大家分享的loading加载的设计,文章里面会有一些实例在这分享给大家! 大多数App都要与服务器进行数据的交换,App向服务器发出数据请求,服务器接收到请求之后向App传输相应数据, ...
- ExtJS 4.1 TabPanel动态加载页面并执行脚本【转】
ExtJS 4.1 TabPanel动态加载页面并执行脚本 按照官方示例,可以动态加载页面,可是脚本不执行,于是查SDK.google,发现scripts需要设置为true,于是设置该属性,整个代码如 ...
随机推荐
- 怎样提供一个好的移动API接口服务/从零到一[开发篇]
引语:现在互联网那么热,你手里没几个APP都不好意思跟别人打招呼!但是,难道APP就是全能的神吗?答案是否定的,除了优雅的APP前端展示,其实核心还是服务器端.数据的保存.查询.消息的推送,无不是在服 ...
- SQL-1--语句分类
- Could not load file or assembly Microsoft.SqlServer.management.sdk.sfc version 11.0.0.0
I have installed MS SQL Server 2012 R2 and when I try to update model from database under EDMX file ...
- C++primer笔记之顺序容器
最近又重新拾起C++primer,发现每一次看都会有不同的体验,但每一次看后因为不常用,忘记得很快,所以记笔记是很关键的一环,咋一看是浪费时间,实际上是节省了很多时间.下面就把这一节的内容做一个简单的 ...
- C# 获取媒体文件播放时长
引用: Interop.Shell32.dll 方法: /// <summary> /// 获取媒体文件播放时长 /// </summary> /// <param na ...
- [视频]K8飞刀 BadUSB Teensy自动种马演示教程
[视频]K8飞刀 Teensy USB自动种马演示教程 链接: https://pan.baidu.com/s/13bM1XSLrhlf90FDmPGfo1g 提取码: gy2q 源码:https:/ ...
- IIS服务器多站点 的 https证书使用443端口 解决方案
默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTTPS只能更改IIS配置 首先把每个站点分配个不同端口,如443.444.445…(证书一定要是多域的) 然后重 ...
- RobotFramework测试问题二:各种元素不能定位问题
各种元素不能定位问题 一.元素定位 A. Click Element + xpath B. Click Element + contains C. Execute Javascript + getEl ...
- 复刻smartbits的国产网络测试工具minismb简介
复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带 ...
- mysql计算两个日期相差的天数
DATEDIFF() 函数可以返回两个日期之间的天数. 如下: SELECT DATEDIFF('2015-06-29','2015-06-12') AS DiffDate 结果得17 SELECT ...