Paging 3 不显示页脚

Footer not showing with Paging 3

我正在关注 Paging 3 的 Codelab。

分页工作正常,但尝试添加页脚似乎不起作用。

LoadStateAdapter使用

而言,我的代码与 Codelab 完全一样
class ListLoadStateAdapter(
    private val retry: () -> Unit,
) : LoadStateAdapter<ListLoadStateAdapter.ListLoadStateViewHolder>() {

    override fun onBindViewHolder(holder: ListLoadStateViewHolder, loadState: LoadState) {
        holder.bind(loadState)
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        loadState: LoadState,
    ) = ListLoadStateViewHolder.create(parent, retry)

    class ListLoadStateViewHolder(
        private val binding: ComponentPagedListFooterBinding,
        retry: () -> Unit,
    ) : RecyclerView.ViewHolder(binding.root) {

        init {
            binding.buttonRetry.setOnClickListener { retry.invoke() }
        }

        fun bind(loadState: LoadState) {
            if (loadState is LoadState.Error) {
                binding.textViewPlaceholderError.text = loadState.error.localizedMessage
            }

            binding.progressBar.isVisible = loadState is LoadState.Loading
            binding.buttonRetry.isVisible = loadState is LoadState.Error
            binding.textViewPlaceholderError.isVisible = loadState is LoadState.Error

//            binding.root.isVisible = loadState is LoadState.Loading || loadState is LoadState.Error
        }

        companion object {
            fun create(parent: ViewGroup, retry: () -> Unit): ListLoadStateViewHolder {
                val binding = ComponentPagedListFooterBinding.inflate(
                    LayoutInflater.from(parent.context),
                    parent,
                    false,
                )

                return ListLoadStateViewHolder(binding, retry)
            }
        }
    }
}

这就是我添加页脚的方式

adapter = this@InvoiceListFragment.adapter.apply {
                withLoadStateFooter(ListLoadStateAdapter { retry() })

                addLoadStateListener {
                    viewModel.handlePagingState(it, this)
                }
            }

handlePagingState只是跟随状态绑定到页面状态(Loading、Error、Empty等)。删除它无论如何都没有改变。

ListLoadStateAdapter.onCreateViewHolder() 甚至没有被调用,ListLoadStateViewHolder 的构造函数也没有被调用。

我做错了什么?我错过了什么吗?或者可能是某个地方的错误?

我的问题是我没有设置 withLoadStateFooter

返回的 ConcatAdapter

我遇到了保存问题。我的问题是我最初尝试在没有互联网的情况下从缓存中加载项目,在这种情况下页脚没有出现。当我从 api 加载项目而不是从互联网加载项目时 - 页脚工作正常。

如果有人仍然面临同样的问题。您必须将新的适配器应用到回收站视图。

val adapterWithLoading = adapter.withLoadStateFooter(PagingLoadStateAdapter(adapter::retry))

binding.recycler.apply {
    layoutManager = LinearLayoutManager(context)
    adapter = adapterWithLoading
    addItemDecoration(ItemHorizontalDecorator())
}

根据答案改进:

我已经为此创建了一个扩展函数,

fun <T : Any, VH : RecyclerView.ViewHolder> PagingDataAdapter<T, VH>.loadFooter(): ConcatAdapter {

    Timber.e("Appending footer")
    return this.withLoadStateFooter(
        footer = FooterAdapter {
            this.retry()
        }
    )
}

这样我们就可以在回收器视图适配器初始化期间直接调用它,

rv.adapter = customPagingAdapter.loadFooter()

FooterAdapter Impl 的其余部分。与代码实验室相同。