RecyclerView设置空布局

42 阅读1分钟

参考了以下几种设置空布局的方法: RecyclerView实现空视图切换_recyclerview如何设置无数据图-CSDN博客

juejin.cn/post/684490…

之前一直都是在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和空布局的显示位置可能不一样。