kotlin 如何使用分页,以便在不分页的情况下片段中的代码更少3

ivqmmu1c  于 2023-06-24  发布在  Kotlin
关注(0)|答案(1)|浏览(1358)

我解析了NewsApi并使用了干净的架构ListAdapter。我需要做“分页”,以便在我的片段是更少的代码。通过使用抽象类或扩展文件,但我不知道,怎么做。我也不明白如何在ListAdapter中做addAll方法,这样过去的项目就不会消失。我如何理解分页3与干净的体系结构不兼容。
我试着做了以下几件事:https://coderoad.ru/51433106/kotlin-RecyclerView-%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86但是失败了。
还有以下内容:

fun pagination(viewModel: EverythingViewModel): RecyclerView.OnScrollListener {
return object : RecyclerView.OnScrollListener() {
  override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
      super.onScrolled(recyclerView, dx, dy)

      if (dy > 0) {
          val layoutManager = recyclerView.layoutManager as LinearLayoutManager
          val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition()
          val visibleItemCount = layoutManager.childCount
          val totalItemCount = layoutManager.itemCount
          if (visibleItemCount + firstVisibleItemPosition >= totalItemCount) {
              viewModel.page++
              viewModel.getEverything()
          }
       }
     }
   }
 }

也失败了
如果你需要更多的细节写我在评论

xsuvu9jc

xsuvu9jc1#

这里是https://medium.com/@anitaa_1990/pagination-in-recyclerview-without-paging-library-1c48e9328f81的原始文章。基本上,作者使用custon onScrollListener,但我更新了代码以避免一些bug。

abstract class RecyclerViewPaginator : RecyclerView.OnScrollListener() {

private var currentPage = 1
private var endWithAuto = false

abstract var isLastPage: Boolean


override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
    super.onScrolled(recyclerView, dx, dy)
    val layoutManager = recyclerView.layoutManager
    val visibleItemCount = layoutManager!!.childCount
    val totalItemCount = layoutManager.itemCount

    val lastVisiblePosition: Int = when (layoutManager) {
        is GridLayoutManager -> layoutManager.findLastVisibleItemPosition()
        else -> (layoutManager as LinearLayoutManager).findLastVisibleItemPosition()
    }

    if (isLastPage) {
        return
    }

    if (visibleItemCount + lastVisiblePosition >= totalItemCount) {
        if (!endWithAuto) {
            endWithAuto = true
            loadMore(++currentPage)
        }
    }
    else {
        endWithAuto = false
    }
}

abstract fun loadMore(start: Int)}

请注意,如果你在片段中使用它,你应该创建onAttach示例(解决了我的导航错误)。您可以正确地定义一个函数来获取视图模型中的值。然后在你的片段中订阅livedata。

相关问题