【已解决】 喜马拉雅项目:“网络错误"的View无法显示到手机,应该如何定位问题?
问题
在完成喜马拉雅项目“UILoader的完成”时,断网然后打开程序时,没有显示mNetworkErrorView(mNetworkErrorView的Visibility为0,也就是说“可见”)。
而当联网时,SuccessView成功显示。
调试截图


-------------------
自己的猜想
会不会是mNetworkErrorView在得到的时候没有像 SuccessView获取时有一个View Group呢?如果要改,应该怎么改呢?
问题找到了,在RecommendFragment.java的onSubViewLoad()方法中,返回的应该是UiLoader而不是代码中的mRootView 。
当请求数据返回时,如果失败就转到了handleError(),执行callback.onNetworkError();
而执行该函数的主体就是UiLoader,最后就自然是要返回UiLoader的
代码补充
public abstract class UILoader extends FrameLayout { private static final String TAG = "UILoader"; private View mLoadingView; private View mSuccessView; private View mNetworkErrorView; private View mEmptyView; public enum UIStatus { LOADING,SUCCESS,NETWORK_ERROR,EMPTY,NONE } public UIStatus mCurrentStatus = UIStatus.NONE; public UILoader(@NonNull Context context) { this(context,null); } public UILoader(@NonNull Context context, @Nullable AttributeSet attrs) { this(context,attrs,0); } public UILoader(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } //更新UI public void updateStatus(UIStatus status){ mCurrentStatus = status; BaseApplication.getHandler().post(new Runnable() { @Override public void run() { switchUIByCurrentStatus(); } }); } /** * 初始化UI:把相关的UI加载进来 */ private void init() { switchUIByCurrentStatus(); } private void switchUIByCurrentStatus() { //加载中 LogUtils.d(TAG,"当前状态是" + mCurrentStatus); if (mLoadingView == null) { mLoadingView = getLoadingView(); addView(mLoadingView); } //根据状态设置是否可见 mLoadingView.setVisibility(mCurrentStatus==UIStatus.LOADING ? VISIBLE:GONE); //成功 if (mSuccessView == null) { mSuccessView = getSuccessView(this); addView(mSuccessView); } //根据状态设置是否可见 mSuccessView.setVisibility(mCurrentStatus==UIStatus.SUCCESS ? VISIBLE:GONE);//加载中 //网络错误页面 if (mNetworkErrorView == null) { mNetworkErrorView = getNetworkErrorView(); addView(mNetworkErrorView); } //根据状态设置是否可见 mNetworkErrorView.setVisibility(mCurrentStatus==UIStatus.NETWORK_ERROR ? VISIBLE:GONE); LogUtils.d(TAG ,"mNetworkErrorView的visibility属性为" + mNetworkErrorView.getVisibility()); //数据为空 if (mEmptyView == null) { mEmptyView = getEmptyView(); addView(mEmptyView); } //根据状态设置是否可见 mEmptyView.setVisibility(mCurrentStatus==UIStatus.EMPTY ? VISIBLE:GONE); } private View getEmptyView() { return LayoutInflater.from(getContext()).inflate(R.layout.fragment_empty_view,this,false); } private View getNetworkErrorView(){ View networkErrorView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_error_view,this,false); return networkErrorView; } protected abstract View getSuccessView(ViewGroup container); private View getLoadingView() { return LayoutInflater.from(getContext()).inflate(R.layout.fragment_loading_view,this,false); } }public class RecommendFragment extends BaseFragment implements IRecommendViewCallback{ private static final String TAG = "RecommendFragment"; private View mRootView; private RecyclerView mRecommendRv; private RecommendListAdapter mRecommendListAdapter; private RecommendPresenter mRecommendPresenter; private UILoader mUiLoader; @Override protected View onSubViewLoaded(final LayoutInflater layoutInflater, ViewGroup container) { mUiLoader = new UILoader(getContext()) { @Override protected View getSuccessView(ViewGroup container) { return createSuccessView(layoutInflater,container); } }; //RecycleView的使用 //找到控件 //获取数据 //getRecommendData(); //先获取逻辑层的对象 mRecommendPresenter = RecommendPresenter.getInstance(); //注册通知接口 mRecommendPresenter.registerViewCallback(this); //获取推荐列表 mRecommendPresenter.getRecommendList(); if (mUiLoader.getParent() instanceof ViewGroup) { ((ViewGroup) mUiLoader.getParent()).removeView(mUiLoader); } //返回view,给界面显示 return mRootView; } private View createSuccessView(LayoutInflater layoutInflater, ViewGroup container) { mRootView = layoutInflater.inflate(R.layout.fragment_recommend,container,false); mRecommendRv = mRootView.findViewById(R.id.recommend_list); //设置RecycleView的管理器 LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mRecommendRv.setLayoutManager(layoutManager); mRecommendRv.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { outRect.top = UIUtil.dip2px(view.getContext(),5); outRect.bottom = UIUtil.dip2px(view.getContext(),5); outRect.left = UIUtil.dip2px(view.getContext(),5); outRect.right = UIUtil.dip2px(view.getContext(),5); } }); //设置适配器 mRecommendListAdapter = new RecommendListAdapter(); mRecommendRv.setAdapter(mRecommendListAdapter); return mRootView; } @Override public void onRecommendListLoaded(List<Album> result) { LogUtils.d(TAG,"RecommendListLoaded"); //当获取到内容时,该方法被调用 //更新UI mRecommendListAdapter.setData(result); mUiLoader.updateStatus(UILoader.UIStatus.SUCCESS); } @Override public void onNetworkError() { LogUtils.d(TAG,"NETWORK_ERROR"); mUiLoader.updateStatus(UILoader.UIStatus.NETWORK_ERROR); } @Override public void onEmpty() { LogUtils.d(TAG,"EMPTY"); mUiLoader.updateStatus(UILoader.UIStatus.EMPTY); } @Override public void onLoading() { LogUtils.d(TAG,"LOADING"); mUiLoader.updateStatus(UILoader.UIStatus.LOADING); } @Override public void onDestroyView() { super.onDestroyView(); //取消接口注册,以免内存泄漏 if (mRecommendPresenter != null) { mRecommendPresenter.unregisterViewCallback(this); } } }那你自己想呗,至少你得把代码弄上来吧。
你UILoader里的更新状态的代码呢?一走的流程你给上来呀。
哇,感谢!我也遇见了相同的问题