未显示分页 3 初始加载

2023-11-20

我正在使用分页 3,除了初始加载状态之外,一切正常。我正在添加withLoadStateFooter但它在第一次调用时从不显示加载状态

这是我的实现

负载状态适配器

class LoadStateAdapter (
    private val retry: () -> Unit
): LoadStateAdapter<LoadStateViewHolder>() {

    override fun onBindViewHolder(holder: LoadStateViewHolder, loadState: LoadState) {
        holder.bindTo(loadState)
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        loadState: LoadState
    ): LoadStateViewHolder {
        return LoadStateViewHolder.create(parent, retry)
    }
}

加载状态视图持有者

class LoadStateViewHolder(
    view : View,
    private val retryCallback: () -> Unit
) : RecyclerView.ViewHolder(view) {

    private val progressBar = view.findViewById<ProgressBar>(R.id.progress_bar)
    private val errorMsg = view.findViewById<TextView>(R.id.error_msg)
    private val btnRetry = view.findViewById<Button>(R.id.retry_button)
        .also {
            it.setOnClickListener { retryCallback() }
        }
    private var loadState : LoadState? = null

    companion object {
        fun create(parent: ViewGroup, retryCallback: () -> Unit): LoadStateViewHolder {
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.network_state_item, parent, false)
            return LoadStateViewHolder(
                view,
                retryCallback
            )
        }
    }


    fun bindTo(loadState: LoadState) {
        this.loadState = loadState

        btnRetry.isVisible = loadState !is LoadState.Loading
        errorMsg.isVisible = loadState !is LoadState.Loading
        progressBar.isVisible = loadState is LoadState.Loading

        if (loadState is LoadState.Error){
            errorMsg.text = loadState.error.localizedMessage
        }
    }
}

分页源

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Model> {

    try {
        // Load page 1 if undefined.
        val currentPage = params.key ?: 0
        val offset = currentPage * 50

        val requestParams = hashMapOf<String, Any>()
        requestParams.put("limit", 50)
        requestParams.put("offset", offset)

        val response =  repository.getList(requestParams)
        val isFinish = response.paging != null && response.paging!!.next == null

        return LoadResult.Page(
            data = response.data ?: mutableListOf(),
            prevKey = null, // Only paging forward.
            nextKey = if (isFinish) null else currentPage + 1
        )
    } catch (e: Exception) {
        // Handle errors in this block
        return LoadResult.Error(e)
    }
}

查看模型

val listPagingFlow = Pager(PagingConfig(pageSize = 50)) {
    MyPagingSource(repository)
}.flow.cachedIn(viewModelScope)

Activity

    val pagingAdapter = MyPagingAdapter()
    list.apply {
        setHasFixedSize(true)
        adapter = pagingAdapter.withLoadStateFooter(
            footer = LoadStateAdapter { pagingAdapter.retry() }
        )
    }

    lifecycleScope.launch(Dispatchers.IO) {
        viewModel.listPagingFlow.collectLatest { pagingData ->
            pagingAdapter.submitData(pagingData)
        }
    }

我的分页适配器很简单PagingDataAdapter

简而言之;加载状态工作正常,但在第一次请求时没有显示。有人可以帮忙吗?

当前版本3.0.0-alpha04


withLoadStateFooter返回一个ConcatAdapter连接原始结果PagingDataAdapter with a LoadStateAdapter那个听CombinedLoadState.append事件。因此,预计它不会在初始加载期间返回项目(loadType ==REFRESH),它是这样设计的,因为在加载任何项目之前显示“页脚”并没有真正的意义。

然而,为了实现你想要的,你可以简单地创建你自己的 ConcatAdapter ,它反映了.withLoadStateFooter很接近的:

val originalAdapter = MyPagingDataAdapter(...)
val footerLoadStateAdapter = MyFooterLoadStateAdapter(...)

addLoadStateListener { loadStates ->
    // You need to implement some logic here to update LoadStateAdapter.loadState
    // based on however you want to prioritize between REFRESH / APPEND load states.
    // Something really basic might be:
    // footerLoadStateAdapter.loadState = when {
    //     loadStates.refresh is NotLoading -> loadStates.append
    //     else -> loadStates.refresh
    // }
    footerLoadStateAdapter.loadState = ...
}
return ConcatAdapter(originalAdapter, footerLoadStateAdapter)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未显示分页 3 初始加载 的相关文章

随机推荐

  • 获取非常大的文件的 MD5 校验和

    我编写了一个脚本 该脚本读取目录中的所有文件并返回每个文件的 md5 哈希值 但是 对于相当大的文件 它不会呈现任何内容 我假设解释器为最大处理时间设置了一些值 并且由于获取该值需要很长时间 因此它只是跳到其他文件 有没有办法通过 PHP
  • 如何在 yii 框架中自动设置 url 友好

    我刚刚学习 yii 框架并阅读了本教程 关于yii 如何设置 url 但我不知道 假设我有10个控制器 我应该在配置文件中一一定义控制器吗 有没有更好的方法来为所有控制器设置像 www yoursite com yourController
  • 将标题层次结构生成为有序列表

    我已经思考这个问题有一段时间了 但无法想出可行的解决方案 我什至无法对其进行伪编码 举例来说 您有一个标题结构如下的页面 h1 Heading level 1 h1 h2 Sub heading 1 h2 h2 Sub heading 2
  • 在运行时请求权限,Android M+

    首先 我知道这是一个重复的问题 但我已经看过其他类似问题的答案 但未能通过这些解决方案取得成功 我开发了一个应用程序 它可以在我的测试设备上完美运行 该设备是运行 Android L 5 0 1 的三星 S4 但我希望该应用程序也可以在较新
  • 从 Windows 获取 Rssi 值

    我想测量调制解调器的 rssi 值 是否有任何 api 可以获取 Windows 的 rssi 值 我曾经使用 android 中的 Wifi Manager 来做到这一点 但我找不到任何适用于 Windows 的 api 使用本机代码是最
  • R / ggplot2:评估表达式内的对象

    示例代码 rsq lt round cor mtcars disp mtcars mpg 2 2 rsq 0 72 ggplot mtcars aes x disp y mpg geom point geom smooth method l
  • 使用 rspec 和 capybara 测试由 cocoon 动态添加的字段

    我想知道是否有人测试由 cocoon 动态添加的字段 这是一个很好的节省时间的方法 但是动态添加的所有字段都在 ID 和名称中添加了非常长的数字 这意味着我必须跳过需要页面上多个 一组 字段的测试 Afaik 你可以测试两件事 嵌套元素的动
  • PlayStore 不断拒绝 MANAGE_EXTERNAL_STORAGE 权限的应用程序更新,并且应用程序描述也未更新

    我的应用程序帮助用户管理 Whatsapp 贴纸链接到应用程序它在第一个版本中支持 SDK30 但在该版本之后 当我尝试更新新版本的应用程序 Playstore 时 我的应用程序状态被拒绝 我尝试了多次 我已经在应用程序描述甚至应用程序中提
  • 列表框项目加载动画

    我想使用这样的动画创建基于ListBox ListView 的用户控件 列表框中的项目不会一次全部加载 它们必须逐步加载 逐项 第一个然后第二个 然后第三个 等 它们之间有一些超时 我怎样才能做到这一点 您可以为此使用 Blend SDK
  • 验证规则唯一需要至少 1 个参数

    我的 laravel 有问题 我无法发布数据 一个错误说 InvalidArgumentException in Validator php line 2593 Validation rule unique requires at leas
  • SBT 可以发布到 JFrog 工件吗

    我的组织使用 JFROG 工件来分发所有 jar 到目前为止 我一直使用 SBT 进行 Scala 开发 但是现在 当我正在寻找将 SBT 构建的 jar 发布到 JFROG 工件的方法时 我只在 github 上找到了这个处于 alpha
  • 在python中将域名转换为idn

    我有一长串域名 需要生成一些报告 该列表包含一些 IDN 域 尽管我知道如何在命令行上用 python 转换它们 gt gt gt domain u pfarmer com gt gt gt domain u pfarmer xfc com
  • 如何在 cocoa/iOS 中进行 SHA 哈希

    给定消息和盐 我如何对其进行编码以返回散列字符串 我需要重现 php 函数 hash hmac sha256 message salt Thanks 找到了答案 import
  • 当列表视图位于片段中时,如何在活动中使用 Searchview 过滤列表视图

    我想实现以下屏幕 正如您在这里所看到的 SearchView 位于包含三个选项卡的活动中 每个选项卡都是使用片段实现的 而片段又包含列表视图 我在包含搜索视图的活动中拥有视图分页器 视图分页器是使用 FragmentStatePagerAd
  • 将 PDF 与 PDFSharp 合并丢失表单字段

    我正在尝试使用 PDFSharp 和此代码将两个创建的 PDF 文件连接到一个新的 PDF 我发现here Open the output document PdfDocument outputDocument new PdfDocumen
  • 将重载运算符重构为非成员函数会破坏任何代码吗?

    考虑具有重载加法运算符的遗留类模板 and template
  • 导入错误:没有名为 distutils 的模块

    尝试安装psutils结果很头疼 python V Python 2 4 2 cat etc SuSE release SUSE Linux Enterprise Server 10 x86 64 VERSION 10 PATCHLEVEL
  • C# 中高效的 AABB/三角形相交

    如果有任何公共 AABB 三角形相交算法 任何人都可以向 CSharp 推荐一个有效的端口吗 我一直在研究莫勒的方法 抽象地描述here 如果我要移植它 我可能会从这个C 版本 这个 C 库由 Mike Vandelay 编写看起来这也可能
  • Solr 基于规则的提升

    我在用Solr 5 0 0 我在田野里寻找product name 我需要添加一些规则才能获得相关结果 如果我搜索一个单词 如果存在完全匹配 它应该排在第一位 例如 如果我搜索laptop 它应该返回准确的product name with
  • 未显示分页 3 初始加载

    我正在使用分页 3 除了初始加载状态之外 一切正常 我正在添加withLoadStateFooter但它在第一次调用时从不显示加载状态 这是我的实现 负载状态适配器 class LoadStateAdapter private val re