RecyclerView实现空视图切换

实际的业务需求中:无列表数据的时候,我们希望显示一个空视图布局,以方便用户直观理解;而当有数据时,则正常加载列表数据。

这样就形成了一个有数据和无数据的布局切换。基于此,本文提供了一种解决方案。

一张没有感情的效果图。
在这里插入图片描述

实现步骤:

1、重写RecyclerView

class SupportEmptyRecyclerView : RecyclerView {

    constructor(context: Context?)
            : super(context!!)

    constructor(context: Context?, attrs: AttributeSet?)
            : super(context!!, attrs)

    constructor(context: Context?, attrs: AttributeSet?, defStyle: Int)
            : super(context!!, attrs, defStyle)


    private var mEmptyView: View? = null

    /**
     * * @param emptyView 设置空视图
     */
    fun setEmptyView(emptyView: View?) {
        mEmptyView = emptyView
    }

    /**
     * 注册观察者
     */
    override fun setAdapter(adapter: Adapter<*>?) {
        super.setAdapter(adapter)
        adapter?.registerAdapterDataObserver(emptyObserver)
    }

    /**
     * 移除观察字
     */
    fun removeObserver() {
        adapter?.unregisterAdapterDataObserver(emptyObserver)
    }

    /**
     * 创建一个RecyclerView自带的观察者,重写onChange函数
     * * 我们大可以在这个观察者这里判断我们的逻辑,就是显示隐藏
     */
    private val emptyObserver: AdapterDataObserver = object : AdapterDataObserver() {
        override fun onChanged() {
            val adapter = adapter
            //判断数据为空否,进行显示或者隐藏
            if (null != adapter && null != mEmptyView) {
                if (0 == adapter.itemCount) {
                    mEmptyView!!.visibility = View.VISIBLE
                    this@SupportEmptyRecyclerView.visibility = View.GONE
                } else {
                    mEmptyView!!.visibility = View.GONE
                    this@SupportEmptyRecyclerView.visibility = View.VISIBLE
                }
            }
        }
    }

}

2、布局中添加空视图布局

<LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <com.scjzbd.mvvmbase.ui.project.view.SupportEmptyRecyclerView
                    android:id="@+id/pa_rv"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />

                <!--todo 自定义的空布局-->
                <include
                    android:id="@+id/empty_view"
                    layout="@layout/layout_empty_view"
                    android:visibility="gone" />
            </LinearLayout>

3、调用设置空视图方法

binding.paRv.setEmptyView(binding.emptyView)

4、关键点说明

利用RecyclerView 自带的观察者 AdapterDataObserver ,实现对数据变化的通知。

再设置适配器的时候,注册观察者:

adapter?.registerAdapterDataObserver(emptyObserver)

当我们调用适配的,notifyDataSetChanged方法时,会通知已注册的观察者,并进入观察者的onChanged函数。

onChanged函数主要是根据数据适配器adapter.itemCount的数量,来判断数据是否需要切换空视图布局(显示/隐藏 的方式)。






原创不易,求个关注。

在这里插入图片描述

微信公众号:一粒尘埃的漫旅
里面有很多想对大家说的话,就像和朋友聊聊天。
写代码,做设计,聊生活,聊工作,聊职场。
我见到的世界是什么样子的?
搜索关注我吧。

公众号与博客的内容不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值