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 的其余部分。与代码实验室相同。
我正在关注 Paging 3 的 Codelab。
分页工作正常,但尝试添加页脚似乎不起作用。
就LoadStateAdapter
使用
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 的其余部分。与代码实验室相同。