MVVM内存优化之ViewStub

396 阅读1分钟

通常开发中,界面的显示通常都会有:加载中,网络错误,数据为空等多种状态,这些状态只有在某些情况下才显示,如果用View.setVisibility来控制的话,即使不显示也会占用资源,而用ViewStub可以在用到时再去加载资源.

ViewStub介绍

ViewStub 是一个轻量级的View,Inflate之前不显示,占用资源非常小。当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所指向向的布局就会被Inflate实例化,并替换掉ViewStub, ViewStub的layout params会传给它所指向的布局.

特点:

    1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
    1. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。

用法:

layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar_root"
        >
        <ViewStub
            android:id="@+id/view_stub_error"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout="@layout/stub_net_error"
            />

    </RelativeLayout>
</RelativeLayout>

stub_net_error.xml

<com.fly.tour.common.view.NetErrorView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view_net_error"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

通过ViewStub.inflate和setVisibility控制网络错误界面的显示与否

mViewStubError = findViewById(R.id.view_stub_error);
public void showNetWorkErrView(boolean show) {
        if (mNetErrorView == null) {
            View view = mViewStubError.inflate();
            mNetErrorView = view.findViewById(R.id.view_net_error);
            mNetErrorView.setRefreshBtnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!NetUtil.checkNetToast()) {
                        return;
                    }
                    showNetWorkErrView(false);
                    initData();
                }
            });
        }
        mNetErrorView.setVisibility(show ? View.VISIBLE : View.GONE);
    }