课堂笔记
- 首先创建一个“坑”作为 rootView,用它来装不同状态下的view
    View rootView = inflater.inflate(R.layout.base_fragment_layout, container, false);
    protected View loadErrorView(LayoutInflater inflater, ViewGroup container) {
        return inflater.inflate(R.layout.fragment_error, container, false);
    }
    protected View loadEmptyView(LayoutInflater inflater, ViewGroup container) {
        return inflater.inflate(R.layout.fragment_empty, container, false);
    }
    protected View loadLoadingView(LayoutInflater inflater, ViewGroup container) {
        return inflater.inflate(R.layout.fragment_loading, container, false);
    } 
    protected View loadSuccessView(LayoutInflater inflater, ViewGroup container) {
        return inflater.inflate(getRootViewResId(), container, false);
    }
- 加载不同状态的 view,但开始都让它们不显示(setUpState(State.NONE);)
    private void loadStatesView(LayoutInflater inflater, ViewGroup container) {
        //成功的view
        mSuccessView = loadSuccessView(inflater, container);
        mBaseContainer.addView(mSuccessView);
        //加载状态的view
        mLoadingView = loadLoadingView(inflater, container);
        mBaseContainer.addView(mLoadingView);
        //空 view
        mEmptyView = loadEmptyView(inflater, container);
        mBaseContainer.addView(mEmptyView);
        //错误 view
        mErrorView = loadError(inflater, container);
        mBaseContainer.addView(mErrorView);
    protected enum State {
        NONE,EMPTY,LOADING,SUCCESS,ERROR
    }
    protected void setUpState(State currentState) {
        mSuccessView.setVisibility(currentState == State.SUCCESS ? View.VISIBLE : View.GONE);
        mLoadingView.setVisibility(currentState == State.LOADING ? View.VISIBLE : View.GONE);
        mEmptyView.setVisibility(currentState == State.EMPTY ? View.VISIBLE : View.GONE);
        mErrorView.setVisibility(currentState == State.ERROR ? View.VISIBLE : View.GONE);
    }
- 这样子类就可以在不同状态下设置对应的界面了
- 在 view 接口中添加不同的状态
public interface IHomeCallback {
    //当分类获取成功
    void onCategoryLoaded(Categories categories);
    //获取分类失败
    void onNetworkError();
    //分类加载中
    void onLoading();
    //获取分类为空
    void onEmpty();
}
- HomeFragment 中在不同的状态设置显示不同的 view
    @Override
    public void onCategoryLoaded(Categories categories) {
        setUpState(State.SUCCESS);
        if (mHomePagerAdapter != null) {
            mHomePagerAdapter.setCategoriesData(categories);
        }
    }
    @Override
    public void onNetworkError() {
        setUpState(State.ERROR);
    }
    @Override
    public void onLoading() {
        setUpState(State.LOADING);
    
    @Override
    public void onEmpty() {
        setUpState(State.EMPTY);
    }
- 而什么时候需要加载什么样的状态都在逻辑层 HomePresenterImpl 中实现
    @Override
    public void getCategories() {
        if (mCallback != null) {
            mCallback.onLoading();
        }
        Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
        Api api = retrofit.create(Api.class);
        Call<Categories> task = api.getCategories();
        task.enqueue(new Callback<Categories>() {
            @Override
            public void onResponse(Call<Categories> call, Response<Categories> response) {
                int code = response.code();
                if (code == HttpURLConnection.HTTP_OK) {
                    //请求成功
                    Categories categories = response.body();
                    if (mCallback != null) {
                        if (categories == null || categories.getData().size() == 0) {
                            mCallback.onEmpty();
                        } else {
                            mCallback.onCategoryLoaded(categories);
                        }
                    }
                } else {
                    //请求失败
                    if (mCallback != null) {
                        mCallback.onNetworkError();
                    }
                }
            }
            @Override
            public void onFailure(Call<Categories> call, Throwable t) {
                //请求失败
                if (mCallback != null) {
                    mCallback.onNetworkError();
                }
            }
        });
    }
学习感悟
- rootView 和 baseContainer 其实是同一个布局,可以直接用 FrameLayout rootView (但后面还有坑要挖)
View rootView = inflater.inflate(R.layout.base_fragment_layout, container, false);
FrameLayout baseContainer = rootView.findViewById(R.id.base_container);
- Android 初学者一名,请老师和各位同学讨论指正
- 观看视频