package com.pan.simplepicture.widget; import android.graphics.drawable.AnimationDrawable; import android.os.Handler; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.pan.simplepicture.R; import com.pan.simplepicture.activity.BaseActivity; import com.pan.simplepicture.manager.ThreadManager; import com.pan.simplepicture.utils.ViewUtils; 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 static final int TEXT_LOADING = 6; private View mLoadingView; private View mErrorView; private View mEmptyView; private View mSucceedView; private int point = 1; private int mState; private BaseActivity mActivity; public LoadingPage(BaseActivity activity) { super(activity); mActivity = activity; init(); } private void init() { setBackgroundColor(mActivity.getColor(R.color.bg_page)); mState = STATE_UNLOADED; 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)); } setPageVisiableSafe(); } private void setPageVisiableSafe() { // mHandler.removeMessages(TEXT_LOADING); long currentThreadId = Thread.currentThread().getId(); long mainThreadId = mActivity.getMainLooper().getThread().getId(); if (currentThreadId == mainThreadId) { setPageVisiable(); } else { mActivity.post(new Runnable() { @Override public void run() { setPageVisiable(); } }); } } private void setPageVisiable() { if (null != mLoadingView) { mLoadingView.setVisibility(mState == STATE_UNLOADED || mState == STATE_LOADING ? View.VISIBLE : View.GONE); } if (null != mErrorView) { mErrorView.setVisibility(mState == STATE_ERROR ? View.VISIBLE : View.GONE); } if (null != mEmptyView) { mEmptyView.setVisibility(mState == STATE_EMPTY ? View.VISIBLE : View.GONE); } if (mState == STATE_SUCCEED) { if (mSucceedView == null) { mSucceedView = createLoadedView(); ViewUtils.removeSelfFromParent(mSucceedView); addView(mSucceedView, new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); } mSucceedView.setVisibility(View.VISIBLE); } else if (null != mSucceedView) { mSucceedView.setVisibility(View.GONE); } } public void reset() { setState(STATE_UNLOADED); } protected boolean needReset() { return mState == STATE_ERROR || mState == STATE_EMPTY; } protected synchronized void setState(int state) { if (state < STATE_UNLOADED || state > STATE_SUCCEED) { return; } mState = state; setPageVisiableSafe(); } public synchronized void show() { if (needReset()) { mState = STATE_UNLOADED; } if (mState == STATE_UNLOADED) { mState = STATE_LOADING; LoadingTask task = new LoadingTask(); ThreadManager.getLongPool().execute(task); } setPageVisiableSafe(); } protected View createLoadingView() { View view = mActivity.inflate(R.layout.loading_page_loading); ImageView imageView = (ImageView) view.findViewById(R.id.pb_loading); AnimationDrawable animationDrawable = (AnimationDrawable) imageView .getBackground(); animationDrawable.start(); return view; } protected View createEmptyView() { return mActivity.inflate(R.layout.loading_page_empty); } protected View createErrorView() { View view = mActivity.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() { LoadResult result = load(); int state; if (result == LoadResult.ERROR) { state = STATE_ERROR; } else if (result == LoadResult.EMPTY) { state = STATE_EMPTY; } else { state = STATE_SUCCEED; } setState(state); } } public enum LoadResult { ERROR, EMPTY, SUCCEED } }