课堂笔记
- 首先创建一个“坑”作为 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 初学者一名,请老师和各位同学讨论指正
- 观看视频