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

目前只对RecycerlView的父布局是ConstraintLayout做了部分适配,其他父布局下的RecyclerView和空布局的显示位置可能不一样。****
