RecyclerView空布局实现

299 阅读1分钟

RecyclerView空布局实现

1. 空布局adpter代码

class EmptyViewAdapter<T : RecyclerView.Adapter<V>, V : RecyclerView.ViewHolder>(private val adapter: T) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    init {
        // 为了支持adapter.notifyDataSetChanged方法,需注册业务adapter监听
        adapter.registerAdapterDataObserver(object : AdapterDataObserver() {
            override fun onChanged() {
                notifyDataSetChanged()
            }
        })
    }

    // 空布局的ViewType
    private val EMPTY_VIEW = 0xff


    override fun getItemCount(): Int {
        // 判断数据是否空,若是没有数据,而且须要显示空布局,就返回1
        return if (adapter.itemCount != 0) {
            adapter.itemCount
        } else {
            1
        }
    }

    override fun getItemViewType(position: Int): Int {
        return if (adapter.itemCount != 0) {
            adapter.getItemViewType(position)
        } else {
            EMPTY_VIEW
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if (getItemViewType(position) == EMPTY_VIEW) {
            // do nothing
        } else {
            adapter.onBindViewHolder(holder as V, position)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return if (viewType == EMPTY_VIEW) {
            // 建立空布局item
            ViewHolder(parent)
        } else {
            adapter.onCreateViewHolder(parent, viewType)
        }
    }

    class ViewHolder(
        parent: ViewGroup,
        val viewBinding: AdapterEmptyViewBinding = AdapterEmptyViewBinding.inflate(
            LayoutInflater.from(parent.context), parent, false
        )
    ) : RecyclerView.ViewHolder(viewBinding.root) {
        init {
        }
    }
}

2. 空布局xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/app_icon_image_bg"
        android:src="@mipmap/icon_empty" />

</LinearLayout>

3. 具体方式

只需将自定义adpter作为参数传入EmptyAdapter中,使用方式就是这么简单

binding.apkDownloadingRecycle.apply {
    layoutManager = LinearLayoutManager(context)
    adapter = EmptyViewAdapter(appAdapter)
}

4. 最终展示效果

捕获.PNG

捕获2.PNG

如图所示,当数据为空时显示空布局,不为空时正常显示。

5. 结尾

谢谢观看,欢迎大家批评指正。