Android之自定義LoadingViewHelper

針對ListView有setEmpty方法來設置加載失敗時的默認顯示頁面,但擴展性太差。有沒有通用性更強,適用爲任意佈局添加加載中等狀態佈局的方法呢?
答案是確定的,接下來咱們就去實現這樣一個幫助類。申明LoadingViewHelper類,因爲加載成功顯示的佈局爲目標顯示界面,因此採用構造方法注入。對於加載中以及加載失敗顯示的佈局,申明爲抽象方法,由子類決定是否實現,這樣增長了擴展性。
updateLoadingView方法負責根據mLoadingStatus切換顯示對應的佈局,其中針對View的獲取進行了優化,以避免重複實例化loadingView和failedView。
changeLoadingStatus爲外界提供訪問接口,在業務層可控制顯示加載狀態對應的View。
/**
* Created by Administrator on 2016/6/22.
* 加載View時各類狀況下的View顯示
* 未考慮提示View的寬高超出SucceedView的狀況,須要自定義控制非SucceedView的寬高在SuceedView內部
*/
public abstract class LoadingViewHelper {
public static final UtilsLog lg = UtilsLogFactory.getLogger(LoadingViewHelper.class);
private View loadingView;
private View succeedView;//綁定的佈局,用於加載成功時顯示
private View failedView;
private ViewGroup parentViewGroup;//父佈局
private LoadingStatus mLoadingStatus;//默認爲加載中

/**
* 不支持SucceedView的父佈局爲
*
* @param succeedView
*/
public LoadingViewHelper(View succeedView) {
this.succeedView = succeedView;
this.parentViewGroup = (ViewGroup) succeedView.getParent();
if (parentViewGroup == null) {
//此時succeedView爲getDecorView,須要調整
lg.e("ParentViewGroup is null:當前View爲getWindow().getDecorView()");
this.parentViewGroup = (ViewGroup) (succeedView.findViewById(android.R.id.content));
this.succeedView = this.parentViewGroup.getChildAt(0);
}
this.mLoadingStatus = LoadingStatus.Loading;
updateLoadingView();
}

/**
* 根據LoadingStatus切換View顯示
*/
private void updateLoadingView() {
switch (mLoadingStatus) {
case Loading:
lg.e("updateLoadingView:Loading");
if (loadingView == null) {
loadingView = getLoadingView();
/*添加至佈局中*/
if (loadingView != null) {
ViewGroup.LayoutParams layoutParams = succeedView.getLayoutParams();
parentViewGroup.addView(loadingView, layoutParams);
}
}
settingViewVisibilityIfViewNotNull(loadingView, View.VISIBLE)
.settingViewVisibilityIfViewNotNull(succeedView, View.GONE)
.settingViewVisibilityIfViewNotNull(failedView, View.GONE);
break;
case Success:
lg.e("updateLoadingView:Success");
settingViewVisibilityIfViewNotNull(loadingView, View.GONE)
.settingViewVisibilityIfViewNotNull(succeedView, View.VISIBLE)
.settingViewVisibilityIfViewNotNull(failedView, View.GONE);
break;
case Faild:
lg.e("updateLoadingView:Faild");
if (failedView == null) {
failedView = getFailedView(succeedView);
if (failedView != null) {
ViewGroup.LayoutParams layoutParams = succeedView.getLayoutParams();
parentViewGroup.addView(failedView, layoutParams);
}
}
settingViewVisibilityIfViewNotNull(loadingView, View.GONE)
.settingViewVisibilityIfViewNotNull(succeedView, View.GONE)
.settingViewVisibilityIfViewNotNull(failedView, View.VISIBLE);
break;
}
}

/**
* 若View非空,則切換顯示方式
*
* @param view
* @param visibility
* @return
*/
private LoadingViewHelper settingViewVisibilityIfViewNotNull(View view, int visibility) {
if (view != null) {
view.setVisibility(visibility);
}
return this;
}

/**
* 切換更新狀態
*
* @param loadingStatus
*/
public void changeLoadingStatus(LoadingStatus loadingStatus) {
if (loadingStatus != null) {
this.mLoadingStatus = loadingStatus;
updateLoadingView();
}
}

public enum LoadingStatus {
Loading, Success, Faild;
}

/**
* 獲取加載狀態中顯示的佈局
*
* @return
*/
public abstract View getLoadingView();

/**
* 獲取加載失敗顯示的佈局
*
* @param succeedView
* @return
*/
public abstract View getFailedView(View succeedView);
}
具體在業務層的使用方式以下,postDelayed模擬請求數據的耗時操做,這裏的getFailedView方法中自定義請求重試事件。
final LoadingViewHelper loadingViewHelper = new LoadingViewHelper(btnActCahngeSkinShowStyle) {
@Override
public View getLoadingView() {
ImageView imageView = new ImageView(getCurActivity());
imageView.setImageResource(R.mipmap.ic_famer_help_seize);
imageView.setBackgroundColor(Color.RED);
return imageView;
}

@Override
public View getFailedView(View succeedView) {
Button btn = new Button(getCurActivity());
btn.setText("點擊重試");
btn.setBackgroundColor(Color.YELLOW);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
changeLoadingStatus(LoadingStatus.Loading);
AppHelper.getInstance().getLooperHandler().postDelayed(new Runnable() {
@Override
public void run() {
changeLoadingStatus(LoadingStatus.Success);
}
}, 10000);
}
});
return btn;
}
};

AppHelper.getInstance().getLooperHandler().postDelayed(new Runnable() {
@Override
public void run() {
loadingViewHelper.changeLoadingStatus(LoadingViewHelper.LoadingStatus.Faild);
}
}, 10000);
ok,這下全部的View都能添加加載狀態的View顯示效果了。




相關文章
相關標籤/搜索