package com.bczm.widgetcollections.ui.widget; import android.content.Context; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; import com.bczm.widgetcollections.R; import com.bczm.widgetcollections.ThreadManager; import com.bczm.widgetcollections.utils.UIUtils; /** * @author:Jorge on 2015/9/2 11:39 */ public abstract class LoadingPage extends FrameLayout { private static final int STATE_UNLOADED = 0;//未知状态 private static final int STATE_LOADING = 1;//加载状态 private static final int STATE_ERROR = 3;//加载完毕,但是出错状态 private static final int STATE_EMPTY = 4;//加载完毕,但是没有数据状态 private static final int STATE_SUCCEED = 5;//加载成功 private View mLoadingView;//加载时显示的View private View mErrorView;//加载出错显示的View private View mEmptyView;//加载没有数据显示的View private View mSucceedView;//加载成功显示的View private int mState;//当前的状态,显示需要根据该状态判断 public LoadingPage(Context context) { super(context); init(); } private void init() { setBackgroundColor(UIUtils.getColor(R.color.bg_page));//设置背景 mState = STATE_UNLOADED;//初始化状态 //创建对应的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)); } //显示对应的View showPageSafe(); } /** 线程安全的方法 */ private void showPageSafe() { UIUtils.runInMainThread(new Runnable() { @Override public void run() { showPage(); } }); } /** 显示对应的View */ private void showPage() { 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); } // 只有数据成功返回了,才知道成功的View该如何显示,因为该View的显示依赖加载完毕的数据 if (mState == STATE_SUCCEED && mSucceedView == null) { mSucceedView = createLoadedView(); addView(mSucceedView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); } if (null != mSucceedView) { mSucceedView.setVisibility(mState == STATE_SUCCEED ? View.VISIBLE : View.INVISIBLE); } } /** 恢复状态 */ public void reset() { mState = STATE_UNLOADED; showPageSafe(); } /** 是否需要恢复状态 */ protected boolean needReset() { return mState == STATE_ERROR || mState == STATE_EMPTY; } /** 有外部调用,会根据状态判断是否引发load */ public synchronized void show() { if (needReset()) { mState = STATE_UNLOADED; } if (mState == STATE_UNLOADED) { mState = STATE_LOADING; LoadingTask task = new LoadingTask(); ThreadManager.getLongPool().execute(task); }else{ showPageSafe(); } } protected View createLoadingView() { String[] names= UIUtils.getStringArray(R.array.marks); int num= (int) (Math.random()*names.length); View view= UIUtils.inflate(R.layout.loading_page_loading); TextView tv= (TextView) view.findViewById(R.id.tv_mark); tv.setText(names[num]); return view; } protected View createEmptyView() { return UIUtils.inflate(R.layout.loading_page_empty); } protected View createErrorView() { View view = UIUtils.inflate(R.layout.loading_page_error); view.findViewById(R.id.page_bt).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { show(); } }); return view; } public abstract View createLoadedView(); public abstract LoadResult load(); class LoadingTask implements Runnable { @Override public void run() { final LoadResult loadResult = load(); UIUtils.runInMainThread(new Runnable() {//主线程改变UI @Override public void run() { //状态的改变和界面息息相关,所以需要放到主线程来赋值,保障同步性 mState = loadResult.getValue();//根据枚举对象的返回值来改变显示状态码 showPage(); } }); } } public enum LoadResult { ERROR(3), EMPTY(4), SUCCEED(5); int value; LoadResult(int value) { this.value = value; } public int getValue() { return value; } } }