平方X 发表于 2017-9-28 17:13:34

阅读《优雅地处理加载中(loading),重试(retry)和无数据(empty)...



>本文由平方X发表于平方X网,转载请注明出处。[http://blog.pingfangx.com/2390.html](http://blog.pingfangx.com/2390.html)

感谢(http://www.jianshu.com/p/2d3537101281)
[项目地址](https://github.com/KingJA/LoadSir)

会封装提供了一些思路。

# 如何做到即可以全局配置又可以单独设置
全局就用单例,单独设置用内部 builder 新建了一个实例(构造方法依然是私有的,只有内部的 builder 调用)。

# 作用过程
在 application 中设置全局配置的时候,会 setDefaultCallback
调用 LoadSir.getDefault().register 时
LoadService 的构造方法有com.kingja.loadsir.core.LoadService#initCallback
这里面调用了loadLayout.showCallback(defalutCallback);

最后的 showCallbackView 才把 view 展示出来。
```

    private void showCallbackView(Class<? extends Callback> status) {
      if (preCallback != null) {
            callbacks.get(preCallback).onDetach();
      }
      if (getChildCount() > 0) {
            removeAllViews();
      }
      for (Class key : callbacks.keySet()) {
            if (key == status) {
                View rootView = callbacks.get(key).getRootView();
                addView(rootView);
                callbacks.get(key).onAttach(context, rootView);
                preCallback = status;
            }
      }
    }
```

# Fragment 的作用过程
```
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
      savedInstanceState) {
    //第一步:获取布局View
    rootView = View.inflate(getActivity(), R.layout.fragment_a_content, null);
    //第二步:注册布局View
    LoadService loadService = LoadSir.getDefault().register(rootView, new Callback.OnReloadListener() {
      @Override
      public void onReload(View v) {
            // 重新加载逻辑
      }
    });
    //第三步:返回LoadSir生成的LoadLayout
    return loadService.getLoadLayout();
}
protected void loadNet() {
      // 进行网络访问...
      // 进行回调
      loadService.showSuccess();//成功回调
      loadService.showCallback(EmptyCallback.class);//其他回调
    }

```


页: [1]
查看完整版本: 阅读《优雅地处理加载中(loading),重试(retry)和无数据(empty)...