Skip to content

首部加载更多(向上加载更多)

mumu edited this page Aug 26, 2022 · 1 revision

首部加载更多(或称为“向上加载更多”)

关键类 LeadingLoadStateAdapter,继承自 LoadStateAdapter

首部加载更多尾部加载更多是同级关系,同样来自于 LoadStateAdapter 父类,因此使用方式基本一致

基础使用

使用默认的“加载更多”布局,实现“加载更多”的功能

  • 创建所需对象
    // 第一步,创建 adapter
    val mAdapter = RecyclerViewAdapter()
    
    
    // 第二部,使用 Builder 创建 QuickAdapterHelper 对象,这里需要传入你的列表 mAdapter
    val helper = QuickAdapterHelper.Builder(mAdapter)
        // 使用默认样式的首部"加载更多"
        .setLeadingLoadStateAdapter(object : OnLeadingListener {
            override fun onLoad() {
                // 执行加载更多的操作,通常都是网络请求
                request()
            }
    
            override fun isAllowLoading(): Boolean {
                // 是否允许触发“加载更多”
                return true
            }
    }).build()
    
    /**
    * 第三步,给 RecyclerView 设置 Adapter,
    * 注意:这个adapter不是前面创建的 mAdapter,而是 helper 所提供的 adapter(ConcatAdapter)
    */
    recyclerView.adapter = helper.adapter
    
  • 设置数据及加载状态 这里直接对你创建的 mAdapter 操作数据,而不是 ConcatAdapterConcatAdapter
    mAdapter.addAll(0, list)
    
    if(page >= MAX_PAGE) {
        // 没有分页数据了
        /*
        Set the status to not loaded, and there is no paging data.
        设置状态为未加载,并且没有分页数据了
        */
        helper.trailingLoadState = LoadState.NotLoading(true)
        Tips.show("no more data")
    } else {
        // 后续还有分页数据
        /*
        Set the state to not loaded, and there is also paginated data
        设置状态为未加载,并且还有分页数据
        */
        helper.trailingLoadState = LoadState.NotLoading(false)
    }

自定义“加载更多”

  • 需要继承 LeadingLoadStateAdapter 实现自定义类(由于本质是一个Adapter,所以这里除了自定义布局,你还可以做更多的事情)
    class CustomLoadMoreAdapter : LeadingLoadStateAdapter<CustomLoadMoreAdapter.CustomVH>() {
    
        override fun onCreateViewHolder(parent: ViewGroup, loadState: LoadState): CustomVH {
            // 创建你自己的 UI 布局
            val viewBinding = ViewLoadMoreBinding.inflate(LayoutInflater.from(parent.context), parent, false)
            return CustomVH(viewBinding)
        }
    
        override fun onBindViewHolder(holder: CustomVH, loadState: LoadState) {
            // 根据加载状态,来自定义你的 UI 界面
            if (loadState is LoadState.Loading) {
                holder.viewBinding.loadingProgress.visibility = View.VISIBLE
            } else {
                holder.viewBinding.loadingProgress.visibility = View.GONE
            }
        }
    
    
        class CustomVH(val viewBinding: ViewLoadMoreBinding) : RecyclerView.ViewHolder(viewBinding.root)
    }
  • 将自定义"加载更多"传递进去
// 实例化自定义"加载更多"的类
val loadMoreAdapter = CustomLoadMoreAdapter()
loadMoreAdapter.setOnLoadMoreListener(object : OnTrailingListener {
    override fun onLoad() {
        // 执行加载更多的操作,通常都是网络请求
    }

    override fun isAllowLoading(): Boolean {
        // 是否允许触发“加载更多”
        return true
    }
})

helper = QuickAdapterHelper.Builder(mAdapter)
    .setLeadingLoadStateAdapter(loadMoreAdapter) // 传递自定义的“加载跟多”
    .build()

...

功能属性说明

/**
 * Whether enable loading.
 *
 * 是否开启加载功能
*/
val isLoadEnable: Boolean = true

/**
 * Preload, the number of items from the tail.
 *
 * 预加载,距离尾部 item 的个数
 */
var preloadSize = 0