android自訂LoadPager頁面,再也不用擔心重複的代碼啦

來源:互聯網
上載者:User

標籤:

在網上找了很久,都沒有找到自己想要的結果,所以自己就寫了一個,並把它放到了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,使得以後我們少寫很多的代碼。
<pre name="code" class="java">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<Object> ds = (List<Object>) 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);                }            }        }    }}
下面來看看我們在子類中如何使用
</pre><pre code_snippet_id="1677905" snippet_file_name="blog_20160510_8_2136022" name="code" class="java"><pre name="code" class="java">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;    }}
這裡使用線程是為了類比在網路中請求資料的耗時操作。

好了,基本就是這樣了,如果您代碼不夠好,有什麼好的想法可以給我留言或者加我QQ347402035,請填寫理由,否則可能會添加失敗。



android自訂LoadPager頁面,再也不用擔心重複的代碼啦

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.