android自定义LoadPager页面,再也不用担心重复的代码啦

在网上找了很久,都没有找到自己想要的结果,所以自己就写了一个,并把它放到了github上,喜欢的朋友可以去下载源码看下。先上代码
public abstract class LoadPager extends FrameLayout {
    public static final int STATE_UNKOWN = 0;
    public static final int STATE_LOADING = 1;
    public static final int STATE_ERROR = 2;
    public static final int STATE_EMPTY = 3;
    public static final int STATE_SUCCESS = 4;
    public int state = STATE_UNKOWN;

    private View loadingView;// 加载中的界面
    private View errorView;// 错误界面
    private View emptyView;// 空界面
    private View successView;// 加载成功的界面
    
    private Context mContext;

    public LoadPager(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public LoadPager(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
        init();
    }

    public LoadPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    private void init() {
        loadingView = createLoadingView(); // 创建了加载中的界面
        if (loadingView != null) {
            this.addView(loadingView, new FrameLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        errorView = createErrorView(); // 加载错误界面
        if (errorView != null) {
            this.addView(errorView, new FrameLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        emptyView = createEmptyView(); // 加载空的界面
        if (emptyView != null) {
            this.addView(emptyView, new FrameLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        showPage(STATE_LOADING);// 根据不同的状态显示不同的界面
    }

    // 根据不同的状态显示不同的界面
    public void showPage(int result) {
        state = result;
        if (loadingView != null) {
            loadingView.setVisibility(state == STATE_UNKOWN
                    || state == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);
        }
        if (errorView != null) {
            errorView.setVisibility(state == STATE_ERROR ? View.VISIBLE
                    : View.INVISIBLE);
        }
        if (emptyView != null) {
            emptyView.setVisibility(state == STATE_EMPTY ? View.VISIBLE
                    : View.INVISIBLE);
        }
        if (state == STATE_SUCCESS) {
            if (successView == null) {
                successView = createSuccessView();
                this.addView(successView, new FrameLayout.LayoutParams(
                        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
            }
            successView.setVisibility(View.VISIBLE);
        } else {
            if (successView != null) {
                successView.setVisibility(View.INVISIBLE);
            }
        }
    }

    /* 创建了空的界面 */
    private View createEmptyView() {
        return View.inflate(mContext, R.layout.loadpage_empty,
                null);
    }

    /* 创建了错误界面 */
    private View createErrorView() {
        View view = View.inflate(mContext, R.layout.loadpage_error,
                null);
        Button page_bt = (Button) view.findViewById(R.id.page_bt);
        page_bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                show();
            }
        });
        return view;
    }

    /* 创建加载中的界面 */
    private View createLoadingView() {
        return View.inflate(mContext,
                R.layout.loadpage_loading, null);
    }


    // 根据服务器的数据 切换状态
    public void show() {
        if (state == STATE_ERROR || state == STATE_EMPTY) {
            state = STATE_LOADING;
        }

        load();
        showPage(state);

    }

    /***
     * 创建成功的界面
     */
    public abstract View createSuccessView();

    /**
     * 请求服务器
     * 必须在请求完成后调用showPage方法
     */
    protected abstract void load();
}
	上面的注释都写的很清楚啦,如果对此类还不了解的朋友请在下面留言,看到后我将会回复你的。
	下面显示如何在基类中使用LoadPager,使得以后我们少写很多的代码。
public abstract class BaseFragment extends Fragment{

    protected LoadPager mLoadPager = null;
    protected Context mContext = getActivity() == null ? APP.getInstance() : getActivity();

    protected ViewGroup mContainer;
    protected LayoutInflater mInflater;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mContainer = container;
        mInflater = inflater;
        if (mLoadPager == null){
            mLoadPager = new LoadPager(mContext) {
                @Override
                public View createSuccessView() {
                    return BaseFragment.this.createSuccessView();
                }

                @Override
                protected void load() {
                    BaseFragment.this.loadData();
                }
            };
        }


        return mLoadPager;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        show();
    }

    public void show(){
        if(mLoadPager!=null){
            mLoadPager.show();
        }
    }

    /**
     * 必须在获取到数据后调用checkData方法
     * */
    protected abstract void loadData();

    protected abstract View createSuccessView();

    /**校验数据 */
    protected void checkData(Object datas) {
        if(datas==null){
            mLoadPager.showPage(LoadPager.STATE_ERROR);//  请求服务器失败
        }else{
            try {
                @SuppressWarnings("unchecked") List ds = (List) datas;
                if(ds.size()==0){
                    mLoadPager.showPage(LoadPager.STATE_EMPTY);
                }else{
                    mLoadPager.showPage(LoadPager.STATE_SUCCESS);
                }
            } catch (Exception e) {
                e.printStackTrace();
                if("".equals(datas)){
                    mLoadPager.showPage(LoadPager.STATE_EMPTY);
                }else{
                    mLoadPager.showPage(LoadPager.STATE_SUCCESS);
                }
            }
        }

    }
}
 
  
下面来看看我们在子类中如何使用
public class ErrorFragment extends BaseFragment {
    private String str = "加载成功啦";
    @Override
    protected void loadData() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    APP.getMainThreadHandler().post(new Runnable() {
                        @Override
                        public void run() {
                            checkData(null);
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    @Override
    protected View createSuccessView() {
        TextView tv = new TextView(mContext);
        tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
        tv.setText(str);
        return tv;
    }
}
这里使用线程是为了模拟在网络中请求数据的耗时操作。
 
  
	好了,基本就是这样了,如果您代码不够好,有什么好的想法可以给我留言。




你可能感兴趣的:(android)