实际的业务需求中:无列表数据的时候,我们希望显示一个空视图布局,以方便用户直观理解;而当有数据时,则正常加载列表数据。
这样就形成了一个有数据和无数据的布局切换。基于此,本文提供了一种解决方案。
一张没有感情的效果图。
实现步骤:
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的数量,来判断数据是否需要切换空视图布局(显示/隐藏 的方式)。
原创不易,求个关注。
微信公众号:一粒尘埃的漫旅
里面有很多想对大家说的话,就像和朋友聊聊天。
写代码,做设计,聊生活,聊工作,聊职场。
我见到的世界是什么样子的?
搜索关注我吧。
公众号与博客的内容不同。