0
  • 最佳答案

    问题找到了,在RecommendFragment.java的onSubViewLoad()方法中,返回的应该是UiLoader而不是代码中的mRootView 。


    当请求数据返回时,如果失败就转到了handleError(),执行callback.onNetworkError();

    而执行该函数的主体就是UiLoader,最后就自然是要返回UiLoader的

    1295783909438644224  评论     打赏       成为勇
    • 拉大锯  回复 @成为勇
      理解了就好。
      拉大锯 2020-08-27 19:44   回复 1153952789488054272
  • 代码补充

    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);
        }
    }
    






    RecommendFragment
    


    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);
            }
        }
    }
    





    1295783909438644224  评论     打赏       成为勇
    • 拉大锯  回复 @成为勇
      ,断网然后打开程序时,没有显示mNetworkErrorView。那显示的是什么呢? mNetworkErrorView.setVisibility(mCurrentStatus==UIStatus.NETWORK_ERROR ? VISIBLE:GONE);,你说这里面可见,但是显示不对是吧?是不是你的ErrorView里的内容写错了呢?是复制粘贴的吗?
      拉大锯 2020-08-27 19:27   回复 1153952789488054272
  • 那你自己想呗,至少你得把代码弄上来吧。


    你UILoader里的更新状态的代码呢?一走的流程你给上来呀。

    1153952789488054272  评论     打赏       拉大锯
    • 成为勇  回复 @拉大锯
      sorrysorry,一时间忘记把代码放上来了。现在已经添加了代码。 实在是不好意思
      成为勇 2020-08-27 19:20   回复 1295783909438644224
    • 成为勇  回复 @拉大锯
      问题找到了,在RecommendFragment.java的onSubViewLoad()方法中,返回的应该是UiLoader而不是代码中的mRootView 感谢大锯哥的回答,我以后多看几遍视频再来提问
      成为勇 2020-08-27 19:28   回复 1295783909438644224
    • 成为勇  回复 @拉大锯
      errorView应该没有问题,我跟着视频一步步来的。 原因是RecommendFragment.java的onSubViewLoad()方法中,返回值是mRootView 。 应该为UiLoader,现已改正。 感谢大佬帮忙捉虫
      成为勇 2020-08-27 19:38   回复 1295783909438644224
  • 哇,感谢!我也遇见了相同的问题

    1290250275621249024  评论     打赏       longmaoaiali
    相关问题
    拉大锯de · 喜马拉雅项目
    2020-08-18 04:20 508 2
    幻影~ · 提问
    2024-04-13 20:13 10 2
    幻影~ · 找工作
    2024-04-07 10:44 15 2
    幻影~ · 问题
    2024-03-31 17:20 7 2
    TONYGFX · AOSP
    2024-03-28 17:11 4 2