美文网首页
BaseFragment如何去写?懒加载又要怎么去做?

BaseFragment如何去写?懒加载又要怎么去做?

作者: Sky_Blue | 来源:发表于2018-01-20 10:54 被阅读1030次
一、如何去编写BaseFragment?
开发过程中,使用到Fragment的场景还是很多的。有些项目,甚至整个项目就是用Fragment搭建。
那么如何能够愉快的使用Fragment?如何实现懒加载?下面就和大家一步步介绍。
二、开发时的业务流程和Fragment的创建流程
1. 初始化数据,包括上个页面传递过来的数据
2. 创建View。
3. 初始化View。
4. 网络访问后台加载数据。
5. 懒加载的方法
6. 其它的一些细节处理
三、Fragment的生命周期
onAttach()-->onCreate()-->onCreateView()-->>onViewCreated()-->>onDestroyView()-->>onDestroy()

在不同的生命周期,按顺序编写执行方法。

四、BaseFragment的编写
/**
 * Fragment的基类
 */

public abstract class BaseFragment extends Fragment {
    /**
     * 用户设置的ContentView
     */
    protected View mContentView;
    /**
     * View有没有加载过
     */
    protected boolean isViewInitiated;
    /**
     * 页面是否可见
     */
    protected boolean isVisibleToUser;
    /**
     * 是不是加载过
     */
    protected boolean isDataInitiated;

    private Activity mActivity;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mActivity = (Activity) context;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initData(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mContentView = createContentView(container);
        return mContentView;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (!isViewInitiated) {
            initTitle();
            bindView(view);
            initView(view);
            initNet();
        }
        isViewInitiated = true;
        loadData();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        loadData();
    }

    @Override
    public void onDestroyView() {
        unbindView(mContentView);
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        mActivity = null;
        mContentView = null;
        super.onDestroy();
    }

    /**
     * 创建View
     */
    private View createContentView(ViewGroup parent) {
        Object layout = getContentLayout();
        View contentView = null;
        if (layout instanceof View) {
            contentView = (View) layout;
        } else if (layout instanceof Integer) {
            contentView = getLayoutInflater().inflate((Integer) layout, parent, false);
        }
        if (contentView == null) {
            new IllegalArgumentException("getContentLayout must View or LayoutId");
        }
        return contentView;
    }

    protected abstract Object getContentLayout();

    /**
     * 1. 初始化数据,包括上个页面传递过来的数据在这个方法做
     */
    protected void initData(Bundle savedInstanceState) {

    }

    /**
     * 3.1 如果要创建标题
     */
    protected void initTitle() {

    }

    /**
     * 3.2绑定View
     */
    protected void bindView(View contentView) {

    }

    /**
     * 4. 初始化View
     */
    protected void initView(View contentView) {

    }

    /**
     * 5. 初始化网络
     */
    protected void initNet() {

    }

    /**
     * 懒加载
     */
    private void loadData() {
        if (isVisibleToUser && isViewInitiated && (!isDataInitiated)) {
            isDataInitiated = true;
            lazyLoad();
        }
    }

    /**
     * 6. 懒加载,Fragment可见的时候调用这个方法,而且只调用一次
     */
    protected void lazyLoad() {

    }

    /**
     * 解绑contentView
     */
    protected void unbindView(View contentView) {

    }


    /**
     * 打开Activity
     */
    public final void startActivity(Class<?> clazz) {
        startActivity(clazz, null);
    }

    /**
     * 打开Activity
     */
    public final void startActivity(Class<?> clazz, @Nullable Bundle options) {
        Intent intent = new Intent(getAppActivity(), clazz);
        if (options != null) {
            intent.putExtras(options);
        }
        startActivity(intent);
    }

    /**
     * 获取当前的Activity
     */
    public final Activity getAppActivity() {
        return mActivity;
    }

    /**
     * 设置TextView
     */
    public void setText(TextView textView, CharSequence text) {
        if (textView != null && text != null) {
            textView.setText(text);
        }
    }

    /**
     * 闭关页面
     */
    public void finish() {
        if (mActivity != null) {
            mActivity.finish();
        }
    }
}

其实和BaseActivity一样,就多了个懒加载的方法。在ViewPager使用的时候可以使用懒加载的方法去后台请求数据,更新UI。

相关文章

网友评论

      本文标题:BaseFragment如何去写?懒加载又要怎么去做?

      本文链接:https://www.haomeiwen.com/subject/fnnzoxtx.html