import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.heima.googleplay.R;
import com.heima.googleplay.manager.ThreadManager;
import com.heima.googleplay.utils.UIUtils;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
/**
*
*
* ============================================================
**/
public abstract class LoadingPage extends FrameLayout {
//默认状态
private final int UN_LOADING = 1;
//加载状态
private final int LOADING = 2;
//加载失败状态
private final int ERROR = 3;
//加载成功。然后服务器没有返回数据
private final int EMPTY = 4;
//加载成功的状态
private final int SUCCESS = 5;
//用来记录某种状态
private int mState;
private View mLoadingView;
private View mErrorView;
private View mEmptyView;
private View mSuccessView;
public LoadingPage(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
//首先赋值
mState = UN_LOADING;
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));
}
//成功页面根据业务不同页面将不同,所以在此无法添加统一界面
//只能在主线程中展示出来
showSafePage();
}
private void showSafePage() {
UIUtils.runInMainThread(new Runnable() {
@Override
public void run() {
showPage();
}
});
}
//三种页面已经添加到FrameLayout中,通过显示和隐藏来控制显示那个
protected void showPage() {
if(null != mLoadingView){
mLoadingView.setVisibility(mState == UN_LOADING || mState == LOADING ? View.VISIBLE : View.INVISIBLE);
}
if(null != mErrorView){
mErrorView.setVisibility(mState == ERROR ? View.VISIBLE : View.INVISIBLE);
}
if(null != mEmptyView){
mEmptyView.setVisibility(mState == EMPTY ? View.VISIBLE : View.INVISIBLE);
}
if(null == mSuccessView && mState == SUCCESS ){
mSuccessView = createSuccessView();
addView(mSuccessView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
if(null != mSuccessView){
mSuccessView.setVisibility(mState == SUCCESS ? View.VISIBLE : View.INVISIBLE);
}
}
public abstract View createSuccessView();//创建成功后显示的业务界面
private View createEmptyView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_empty);
}
private View createErrorView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_error);
}
private View createLoadingView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_loading);
}
public LoadingPage(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public LoadingPage(Context context) {
super(context);
init();
}
// //加载失败状态
// private final int ERROR = 3;
// //加载成功。然后服务器没有返回数据
// private final int EMPTY = 4;
// //加载成功的状态
// private final int SUCCESS = 5;
public enum LoadResult{
ERROR(3),EMPTY(4),SUCCESS(5);
int value ;
LoadResult(int value){
this.value = value;
}
public int getValue() {
return value;
}
}
//利用线程池
private class LoadTask implements Runnable{
@Override
public void run() {
final LoadResult result = Load();
UIUtils.runInMainThread(new Runnable() {
@Override
public void run() {
mState = result.getValue();
showPage();
}
});
}
}
public void show() {
if(mState == ERROR || mState == EMPTY){
mState = UN_LOADING;
}
if(mState == UN_LOADING){
mState = LOADING;
LoadTask task = new LoadTask();
ThreadManager.getLongPool().execute(task);
// ExecutorService service = Executors.newFixedThreadPool(3);
// LoadTask task = new LoadTask();
// service.execute(task);
}
showSafePage();//加载完数据,在主线程中展示界面出来
}
//从服务器加载数据,返回加载状态(加载数据成功、失败?)
public abstract LoadResult Load() ;
}

import java.util.List;
import com.heima.googleplay.utils.UIUtils;
import com.heima.googleplay.utils.ViewUtils;
import com.heima.googleplay.widget.LoadingPage;
import com.heima.googleplay.widget.LoadingPage.LoadResult;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
public abstract class BaseFragment extends Fragment {
private LoadingPage mContentPage;
//setContentView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//当前的view已经有了一个父亲。必须移除
if(mContentPage == null){
mContentPage = new LoadingPage(UIUtils.getContext()) {
@Override
public View createSuccessView() {
// TODO Auto-generated method stub
return BaseFragment.this.createSuccessView();
}
@Override
public LoadResult Load() {
// TODO Auto-generated method stub
return BaseFragment.this.load();
}
};
}else{
ViewUtils.removeSelfFromParent(mContentPage);
}
return mContentPage;
}
/**
* 检查服务器返回的json数据
* @param object
* @return
*/
protected LoadResult chece(Object object) {
if (object == null) {
return LoadResult.ERROR;
}
if (object instanceof List) {
List list = (List) object;
if (list.size() == 0) {
return LoadResult.EMPTY;
}
}
return LoadResult.SUCCESS;
}
protected abstract LoadResult load();
protected abstract View createSuccessView();
//在MainActivity中调用
public void show() {
if (null != mContentPage) {
mContentPage.show();
}
}
}
View Code

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import com.heima.googleplay.fragment.AppFragment;
import com.heima.googleplay.fragment.BaseFragment;
import com.heima.googleplay.fragment.FragmentFactory;
import com.heima.googleplay.fragment.GameFragment;
import com.heima.googleplay.fragment.HomeFragment;
import com.heima.googleplay.utils.UIUtils;
import com.heima.googleplay.widget.PagerTab;
public class MainActivity extends BaseActivity implements OnPageChangeListener {
private PagerTab mTabs;
private ViewPager mPager;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class MainAdapter extends FragmentStatePagerAdapter{
private String[] tab_names;
private BaseFragment fragment;
public MainAdapter(FragmentManager fm) {
super(fm);
tab_names = UIUtils.getStringArray(R.array.tab_names);
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return tab_names[position];
}
@Override
public Fragment getItem(int position) {
return FragmentFactory.createFragment(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return tab_names.length;
}
}
@Override
protected void initView() {
setContentView(R.layout.activity_main);
mTabs = (PagerTab) findViewById(R.id.tabs);
mPager = (ViewPager) findViewById(R.id.pager);
MainAdapter adapter = new MainAdapter(getSupportFragmentManager());
mPager.setAdapter(adapter);
//绑定到一起
mTabs.setViewPager(mPager);
mTabs.setOnPageChangeListener(this);
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int arg0) {
BaseFragment fragment = FragmentFactory.createFragment(arg0);
fragment.show();
}
}
MainActivity