Home

Awesome

Use

compile 'com.codelang:loadinglayout:1.0.0'

这次,我又推倒重做了=_=,自己都被自己折服了,这次做的是完全解耦的加载布局,不会像之前那样,在根布局添加一个加载布局,这样太耦合,还有ViewPager+Fragment+加载布局,这个比较坑,因为涉及到懒加载的问题,下面我再说吧

使用

具体可以看MainActivity类,下面贴一小段代码

    WQLoad wqLoad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        wqLoad = new WQLoad.Builder(this)
                    .addLoadingCallBack(new LoadingLayout(this))
                    .addEmptyView(new EmptyLayout(this))
                    .addErrorView(new ErrorLayout(this))
                    .build();
                    
        wqLoad.init(this);

        wqLoad.showLoadingView();
        findViewById(R.id.main_content).postDelayed(new Runnable() {
            @Override
            public void run() {
                wqLoad.showErrorView();
            }
        }, 2000);
    }

    //模拟请求网路
    @ErrorClick
    public void pullNet() {
        wqLoad.showLoadingView();
        findViewById(R.id.main_content).postDelayed(new Runnable() {
            @Override
            public void run() {
                wqLoad.showContentView();
            }
        }, 2000);
    }

说明

初始化WQLoad采用Builder模式,可以随意添加不同页面的加载布局,看一下正在加载布局,就是提供一个布局

public class LoadingLayout extends CallBack {

    public LoadingLayout(Context context) {
        super(context);
    }

    @Override
    protected View onCreateView() {
        return LayoutInflater.from(getContext()).inflate(R.layout.loading_load, null, false);
    }
}


wqLoad.init(this)的this主要有两层功能: 一层是通过this获取到是否是Activity,如果是的话,通过activity.findViewById(android.R.id.content)拿到根布局的父布局,这样,我们就可以根据这个父布局进行addView来切换不同的布局。 另一层意思就是反射,通过点击错误布局,寻找this所在类的带有ErrorClick注解方法的,然后invoke,这样点击错误布局就通过反射进行解耦,比回调方便的多

ViewPager+Fragment+WQLoad

具体看TabFragment

这个比较坑的一点是,onCreateView 会执行很多次,我是通过懒加载的lazyLoad操作布局,lazyLoad 拿到了设置的mView,但是由于onCreateView的多次执行,导致mView已不是lazyLoad持有的mView,所以,这里我加了个判断,如果mView为空的再去加载布局

记得用lazyLoad去初始化布局,还有WQLoad,然后,Fragment中的初始化需要带上mView,this还是和Activity一样,为了反射

    @Override
    public void lazyLoad() {

        wqLoad = new WQLoad.Builder(getActivity())
                .addLoadingCallBack(new WQLoadingLayout(getActivity()))
                .build();
        wqLoad.init(this, mView);
        wqLoad.showLoadingView();

        mView.findViewById(R.id.tab_tx).postDelayed(new Runnable() {
            @Override
            public void run() {
                wqLoad.showErrorView();
            }
        }, 2000);
    }


    @ErrorClick
    public void pullNet() {
        wqLoad.showLoadingView();
        mView.findViewById(R.id.tab_tx).postDelayed(new Runnable() {
            @Override
            public void run() {
                wqLoad.showContentView();
            }
        }, 2000);
    }

效果图