参考了以下几种设置空布局的方法: RecyclerView实现空视图切换_recyclerview如何设置无数据图-CSDN博客
之前一直都是在Adapter中写EmptyViewHolder的方法,但是不能完全适配自定义LayoutManager。
所以自己写了一个设置空布局的方法。给RecyclerView的父布局添加EmptyLayout,然后监听Adapter数据,当数据为空是显示空布局,隐藏RecyclerView
fun RecyclerView.setEmptyLayout(@LayoutRes layoutId: Int) {
if (parent !is ViewGroup) {
throw Exception("父布局必须是ViewGroup")
}
val parentView = parent as ViewGroup
val emptyView: View = LayoutInflater.from(this.context).inflate(layoutId, parentView, false)
if (parentView is ConstraintLayout) {
val sourceParams = layoutParams as ConstraintLayout.LayoutParams
val targetParams = ConstraintLayout.LayoutParams(layoutParams)
targetParams.startToStart = sourceParams.startToStart
targetParams.startToEnd = sourceParams.startToEnd
targetParams.endToEnd = sourceParams.endToEnd
targetParams.endToStart = sourceParams.endToStart
targetParams.topToTop = sourceParams.topToTop
targetParams.topToBottom = sourceParams.topToBottom
targetParams.bottomToBottom = sourceParams.bottomToBottom
targetParams.bottomToTop = sourceParams.bottomToTop
targetParams.horizontalBias = sourceParams.horizontalBias
targetParams.verticalBias = sourceParams.verticalBias
parentView.addView(emptyView, targetParams)
}
val rvAdapter = adapter
if (rvAdapter == null) {
throw Exception("先设置adapter,再调用setEmptyLayout")
}
rvAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
emptyView.isVisible = rvAdapter.itemCount == 0
isVisible = rvAdapter.itemCount != 0
}
})
}
效果如下:
目前只对RecycerlView的父布局是ConstraintLayout做了部分适配,其他父布局下的RecyclerView和空布局的显示位置可能不一样。