抽取的BaseFragment和LoadingPage

来源:http://www.cnblogs.com/libuyi/archive/2016/10/07/5936490.html
-Advertisement-
Play Games

【BaseFragment】: 【LoadingPage】: ...


【BaseFragment】:

public abstract class BaseFragment extends Fragment {
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private LoadingPage loadingPage;
private ViewGroup container;
public boolean isInViewPager=false;//繼承的Fragment是否存在於ViewPager中
//預設為false,如果fragment不是在viewpager中它的setUserVisibleHint方法不會執行,預設不可見
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private int isLoad=0;//是否已經載入過
private boolean isVisable;//是否可見
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
this.container=container;
loadingPage=updateLoadingPage();
return loadingPage;
}

/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public LoadingPage updateLoadingPage(){
loadingPage=new LoadingPage(container.getContext()) {
@Override
public int getMyLayoutId() {
return getLayoutId();
}

@Override
public RequestParams getMyParams() {
return getParams();
}

@Override
public String getMyUrl() {
//如果Fragment不在ViewPager里,直接返回url
if(!isInViewPager){
return getUrl();
}
//如果Fragment在ViewPager里,需要分情況考慮
if(TextUtils.isEmpty(getUrl())){//本身就不需要聯網
isLoad=1;
return getUrl();
}else{
if(isVisable){//需要聯網,可見
isLoad=2;
return getUrl();
}else{//需要聯網,不可見
isLoad=3;
return null;
}
}

}

@Override
public void onMySuccess(ReSultState reSultState, View successView) {
ButterKnife.bind(BaseFragment.this, successView);//綁定操作,第1個參數註意不能為this
initTitle();
initData(reSultState.getContent());
}

};
return loadingPage;

}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
showLodingPage();
//為什麼不直接寫loadingPage.show()而要用方法showLodingPage()封裝這句代碼?
//因為showLodingPage()方法,可以使得BaseFragment的繼承者都可以調用
//homeFragment=new HomeFragment();不會調用BaseFragment的onCreateView方法
//在commit()之後,Fragment的生命周期onCreateView才會執行
}

/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public void showLodingPage(){
loadingPage.show();//聯網操作——>改變聯網狀態——>替換掉正在載入的頁面

//模擬聯網耗時操作,正常情況下用上面這句代碼即可
// UIUtils.getHandler().postDelayed(new Runnable() {
// @Override
// public void run() {
// loadingPage.show();
// }
// },2000);

//還可以在LoadingPage的show()方法模擬聯網耗時操作

}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public abstract RequestParams getParams();
public abstract String getUrl();
public abstract int getLayoutId();
public abstract void initTitle();
public abstract void initData(String content);
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
//處理ViewPager的每頁是繼承於BaseFragment的Fragment,預載入的情況
//最終實現的目標:取消ViewPager的預載入+緩存所有載入過的
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisable=isVisibleToUser;
if(isInViewPager && isVisibleToUser && isLoad==3){
loadingPage.show();//這時候loadingPage一定不為null,因為isLoad==3表示已經初始化過
}
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
}

【LoadingPage】:

public abstract class LoadingPage extends FrameLayout {
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private Context mContext;

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_SUCESS=4;

public int state_current=STATE_LOADING;

private View loadingView;
private View errorView;
private View emptyView;
private View successView;

private LayoutParams params;

/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public LoadingPage(Context context) {
this(context, null);
}

public LoadingPage(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public LoadingPage(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext=context;
init();
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private void init() {
params=new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
if(loadingView==null){
loadingView= UIUtils.getXmlView(R.layout.page_loading);
addView(loadingView,params);
}
if(errorView==null){
errorView= UIUtils.getXmlView(R.layout.page_error);
addView(errorView);
}
if(emptyView==null){
emptyView= UIUtils.getXmlView(R.layout.page_empty);
addView(emptyView);
}
showSafePage();
}

/**
* 保證View的顯示在主線程中執行
*/
private void showSafePage() {
UIUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
showPage();
}
});
}

private void showPage() {
loadingView.setVisibility(state_current==STATE_LOADING?VISIBLE:GONE);
errorView.setVisibility(state_current==STATE_ERROR?VISIBLE:GONE);
emptyView.setVisibility(state_current==STATE_EMPTY?VISIBLE:GONE);
if(successView==null){
successView=View.inflate(mContext,getMyLayoutId(),null);//Context:使用Fragment依賴的Activity實例
addView(successView,params);
}
successView.setVisibility(state_current==STATE_SUCESS?VISIBLE:GONE);
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private AsyncHttpClient client=new AsyncHttpClient();//聯網工具
private ReSultState reSultState;//封裝聯網狀態和數據的對象
public void show(){
//處理有些Fragment本身就不需要聯網請求數據的情況,即該Fragment重寫的getUrl方法直接return null
String url=getMyUrl();
if(TextUtils.isEmpty(url)){
state_current=STATE_SUCESS;
reSultState=ReSultState.SUCCESS;
reSultState.setContent("");
//這裡將content設為"",那麼在比如HomeFragment的initData一定要判斷content是否為空
loadPage();
return;
}
//處理有些Fragment需要聯網請求數據的情況,這時候該Fragment的getUrl()返回的是一個url
Runnable runnable=new Runnable() {
@Override
public void run() {
/*-------------------------------------------------------------------*/
//正常情況下的代碼
AsyncHttpResponseHandler responseHandler=new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String content) {//聯網請求數據成功
//content="";//模擬請求數據為空
if(TextUtils.isEmpty(content)){
reSultState=ReSultState.EMPTY;
reSultState.setContent("");
}else{
reSultState=ReSultState.SUCCESS;
reSultState.setContent(content);
}
loadPage();
}
@Override
public void onFailure(Throwable error, String content) {//聯網請求數據失敗
reSultState=ReSultState.ERROR;
reSultState.setContent("");
loadPage();
}
};
client.get(getMyUrl(),getMyParams(),responseHandler);//getMyUrl(),getMyParams()由BaseFragment實現
/*-------------------------------------------------------------------*/
}
};
UIUtils.getHandler().post(runnable);
//UIUtils.getHandler().postDelayed(runnable, 2000);//模擬延時2秒,正常代碼沒有這個
}

/**
* 根據resultState的狀態和數據,更新當前載入狀態state_current,如果是聯網請求成功還需要
* 調用抽象方法onSuccess(resultState,content),在BaseFragment會實現這個抽象方法,
* 從而根據聯網成功的數據載入頁面
*/
private void loadPage() {
switch (reSultState) {
case SUCCESS:
state_current=STATE_SUCESS;
break;
case ERROR:
state_current=STATE_ERROR;
break;
case EMPTY:
state_current=STATE_EMPTY;
break;
}

showSafePage();

if(state_current==STATE_SUCESS){
onMySuccess(reSultState,successView);
}
}

/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
/**
* 封裝聯網狀態和請求結果的枚舉類
*/
public enum ReSultState{
ERROR(2),EMPTY(3),SUCCESS(4);
private int state;
private String content;
ReSultState(int state) {
this.state=state;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
// 抽象方法
public abstract int getMyLayoutId();
public abstract RequestParams getMyParams();
public abstract String getMyUrl();
public abstract void onMySuccess(ReSultState reSultState,View successView);
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/

}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • × 目錄 [1]顯隱效果 [2]高度變化 [3]淡入淡出 前面的話 動畫效果是jQuery吸引人的地方。通過jQuery的動畫方法,能夠輕鬆地為網頁添加視覺效果,給用戶一種全新的體驗。jQuery動畫是一個大的系列,本文將詳細介紹jQuery的三種常見動畫效果——顯隱效果、高度變化及淡入淡出 顯隱 ...
  • 在項目開發時,我們時常需要考慮用戶在使用產品時產生的各種各樣的交互事件,比如滑鼠點擊事件、敲擊鍵盤事件等。這樣的事件行為都是前端DOM事件的組成部分,不同的DOM事件會有不同的觸發條件和觸發效果。本文就將帶大家深入淺出地瞭解DOM事件的那些屬性和方法。 首先在介紹DOM事件之前我們先來認識下DOM的 ...
  • 上一章有對個人作品站點進行一些優化。本章,輪到我們充實這個作品站點了,補充一些項目,從而展示我們的能力。換句話說,我們要構建一個相對複雜的企業網站主頁。 下麵有幾個成功企業的網站: □ Zappos (http://www.zappos.com/) □ Amazon (https://www.ama ...
  • 一、HTML是什麼 HTML的全稱是Hyper Text Markup Language,中譯超文本標記語言(“超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素),它是標準通用標記語言下的一個應用。 而網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共 ...
  • 國慶了,出去玩耍,也有好長時間沒有更新博客了。。 今天就和大家共用一篇技術博文吧。。 CSS中相容的一面 Hack技術大全 相容範圍: IE:6.0+,FireFox:2.0+,Opera 10.0+,Sarari 3.0+,Chrome 參考資料: 各游覽器常用相容標記一覽表: 標記IE6IE7I ...
  • 接上面的船舶管理業務,這裡介紹添加和修改操作。 目錄 1. 添加操作 2. 修改操作 3. 線上演示 1. 添加操作 1.1 創建AddShipWindow.js 在業務中的view目錄下創建一個AddShipWindow.js文件,表示一個增加船舶的視窗組件。 此文件中包含了一個form組件用於顯 ...
  • Atitit.gui api自動化調用技術原理與實踐 gui介面實現分類(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Solu1 other1 Ref2 gui介面實現分類(h5,win gui, paint opengl, ...
  • 最近一段時間正在對JavaScript進行學習,知識太多,需要進行實際的使用和總結,國慶長假正好有時間,寫了下麵對JavaScript總結,可能對事件的理解還不夠完善,希望讀者多多指導,拍磚,我將不勝感激。好了直接如題吧。 JavaScript中的事件流 DOM2級事件規定事件流分為3個階段: 第一 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...