当前位置: 首页>后端>正文

针对RecyclerView的多状态布局管理方案

RecyclerViewStatus,一款针对RecyclerView的多状态布局管理开源框架

开发中经常会遇到列表的空、加载、错误等状态的切换需求。而市面上针对RecyclerView的多状态管理大概有以下两种方案

  1. 在RecyclerView的上层节点添加新的父控件,当需要显示为内容布局的时候则将RecyclerView进行显示;当显示其他状态布局的时候则将RecyclerView隐藏并显示对应的容器

  2. 直接在RecyclerView的Adapter中定义多中itemViewType,然后在onBindViewHolder中判断其itemViewType,再进行相应的处理。

两种方法都有一些弊端,第一种方法的问题在于:由于添加了新的节点所以并不适用于某些特定的布局结构;而第二种方法由于侵入了原本的业务代码导致adapter身兼多职,代码维护效率极差。

那有没有一种更好的方式,能在不影响布局层级的前提下兼顾维护效率?

本框架就是为此而生,并且使用理念极其简单:

以下为使用文档

在你的Activity/Fragment中直接创建RecyclerViewStatus作为成员变量

`

    RecyclerViewStatus recyclerViewStatus = new RecyclerViewStatus();

`

PS:正式使用前确保 recyclerView已调用 setAdapter 和 setLayoutManager

`

    //确保recyclerView setAdapter和setLayoutManager后调用attachToRecyclerView
    recyclerViewStatus.attachToRecyclerView(recyclerView);

`

构造您所需要的StateInflate即完成全部状态的初始化

首个参数为状态id(自定义),第二个参数为布局id,第三个等同于onBindViewHolder的回调(可忽略)

`

    recyclerViewStatus.initStates(Arrays.asList(
            new StateInflate("empty",R.layout.empty_layout),
            new StateInflate<String>("error", R.layout.error_layout, new StateInflate.Block<String>() {
                @Override
                public void onBind(StateAdapter.StateViewHolder viewHolder, String s) {
                    viewHolder.getTextView(R.id.errorText).setText(s);
                }
            }),
            new StateInflate("loading",R.layout.loading_layout)
    ));

`

接下来,只需要在你业务需要的场合调用showContent或者showState,即可切换至不同的状态

`

    //显示原内容
    recyclerViewStatus.showContent();

    //显示加载状态
    recyclerViewStatus.showState("loading");
    
    //显示错误状态
    recyclerViewStatus.showState("error","网络异常,无法获取网络");

`

实现原理

RecyclerViewStatus底层是基于切换recyclerView的Adapter和LayoutManager实现内容布局到状态布局的切换,并且在内部管理了一个ConcatAdapter,动态add或remove对应状态的Adapter,从而实现具体状态的切换。

传送门
XXQAQ/RecyclerViewStatus: 针对RecyclerView的多状态布局管理方案 (github.com)


https://www.xamrdz.com/backend/3wh1931019.html

相关文章: