LoadingPage的抽取

抽取的动机

任何一个联网的view界面展示都有四种情况,

①正在加载

②加载失败

③加载成功,但是没有数据

④加载成功,同时返回数据

public abstract class LoadingPager extends FrameLayout {
//1.定义4种不同的显示状态
private static final int STATE_LOADING = 1;
private static final int STATE_ERROR = 2;
private static final int STATE_EMPTY = 3;
private static final int STATE_SUCCESS = 4;

private int state_current = STATE_LOADING;//默认情况下,当前状态为正在加载

//2.提供4种不同的界面
private View view_loading;
private View view_error;
private View view_empty;
private View view_success;
private LayoutParams params;


public LoadingPager(Context context) {
    this(context, null);
}

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

public LoadingPager(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    init();
}

//初始化方法
private void init() {
    //实例化view
    //1.提供布局显示的参数
    params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    if (view_loading == null) {
        //2.加载布局
        view_loading = UIUtils.getView(R.layout.page_loading);
        //3.添加到当前的frameLayout中
        addView(view_loading, params);
    }

    if (view_empty == null) {
        //2.加载布局
        view_empty = UIUtils.getView(R.layout.page_empty);
        //3.添加到当前的frameLayout中
        addView(view_empty, params);
    }

    if (view_error == null) {
        //2.加载布局
        view_error = UIUtils.getView(R.layout.page_error);
        //3.添加到当前的frameLayout中
        addView(view_error, params);
    }

    showSafePage();
}

//保证如下的操作在主线程中执行的:更新界面
private void showSafePage() {
    UIUtils.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            //保证run()中的操作在主线程中执行
            showPage();
        }
    });
}

private void showPage() {
    //根据当前state_current的值,决定显示哪个view
    view_loading.setVisibility(state_current == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);
    view_error.setVisibility(state_current == STATE_ERROR ? View.VISIBLE : View.INVISIBLE);
    view_empty.setVisibility(state_current == STATE_EMPTY ? View.VISIBLE : View.INVISIBLE);

    if (view_success == null) {
        view_success = UIUtils.getView(layoutId());
        addView(view_success, params);
    }

    view_success.setVisibility(state_current == STATE_SUCCESS ? View.VISIBLE : View.INVISIBLE);
}

public abstract int layoutId();

private ResultState resultState;

//在show()中实现联网加载数据
public void show() {

    String url = url();
    if (TextUtils.isEmpty(url)) {
        resultState = ResultState.SUCCESS;
        resultState.setContent("");
        loadImage();
        return;
    }

    UIUtils.getHandler().postDelayed(new Runnable() {
        @Override
        public void run() {
            //可以换成OKHttp,retrofit等其他框架
            AsyncHttpClient client = new AsyncHttpClient();
            client.get(url(), params(), new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(String content) {
                    if (TextUtils.isEmpty(content)) {// "" or null
                        //state_current = STATE_EMPTY;
                        resultState = ResultState.EMPTY;
                        resultState.setContent("");
                    } else {
                        //state_current = STATE_SUCCESS;
                        resultState = ResultState.SUCCESS;
                        resultState.setContent(content);
                    }

                    //showSafePage();
                    loadImage();
                }

                @Override
                public void onFailure(Throwable error, String content) {
                    //state_current = STATE_ERROR;
                    resultState = ResultState.ERROR;
                    resultState.setContent("");

                    // showSafePage();
                    loadImage();

                }
            });
        }
    }, 2000);


}

private void loadImage() {
    switch (resultState) {
        case ERROR:
            state_current = STATE_ERROR;
            break;
        case EMPTY:
            state_current = STATE_EMPTY;
            break;
        case SUCCESS:
            state_current = STATE_SUCCESS;
            break;
    }
    //根据修改以后的state_current,更新视图的显示。
    showSafePage();

    if (state_current == STATE_SUCCESS) {
        onSuccss(resultState, view_success);
    }
}

protected abstract void onSuccss(ResultState resultState, View view_success);

//提供联网的请求参数
protected abstract RequestParams params();

//提供联网的请求地址
public abstract String url();

//提供枚举类,封装联网以后的状态值和数据
public enum ResultState {

    ERROR(2), EMPTY(3), SUCCESS(4);

    int state;

    ResultState(int state) {
        this.state = state;
    }

    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

}

BaseFragment中简单使用

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  /*  View view= UIUtils.getView(getLayoutId());
    unbinder = ButterKnife.bind(this, view);
    initTitle();
    initData();*/
    loadingPager = new LoadingPager(container.getContext()) {
        @Override
        public int layoutId() {
            return getLayoutId();
        }


        @Override
        protected void onSuccss(ResultState resultState, View view_sucess) {
            unbinder = ButterKnife.bind(BaseFragment.this, view_sucess);
            initData(resultState.getContent());
            initTitle();

        }

        @Override
        protected RequestParams params() {
            return getParams();
        }

        @Override
        public String url() {
            return geturl();
        }
    };
    return loadingPager;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值