【问题标题】:Check if RecyclerView is scrolled on top (findFirstCompletelyVisibleItemPosition will not work)检查 RecyclerView 是否在顶部滚动(findFirstCompletelyVisibleItemPosition 不起作用)
【发布时间】:2017-09-01 22:00:42
【问题描述】:

如何在不使用findFirstCompletelyVisibleItemPosition 的情况下检查回收站视图是否滚动到顶部(列表的开头)?

说明:我不能使用这个方法,因为RecyclerView上的项目很大,有时永远不会“完全可见”,所以该方法会返回-1(RecyclerView.NO_POSITION

我需要知道这一点才能仅在回收站视图到达顶部时触发操作。

 val manager = timelineRecyclerView?.layoutManager as StaggeredGridLayoutManager
 val visibles = manager.findFirstCompletelyVisibleItemPositions(null)

已解决:包含一些帮助代码

    timelineRecyclerView.addOnScrollListener(object:RecyclerView.OnScrollListener() {
        override fun onScrollStateChanged(recyclerView:RecyclerView,
                                 newState:Int) {
            super.onScrollStateChanged(recyclerView, newState)

        }
        override fun onScrolled(recyclerView:RecyclerView, dx:Int, dy:Int) {
            super.onScrolled(recyclerView, dx, dy)

            currentTimelinePosition += dy

            Log.wtf("position", currentTimelinePosition.toString())
            //if the timeline position is on its start, allow swipe and refresh
            swipeLayout.isEnabled = currentTimelinePosition == 0
        }
    })

【问题讨论】:

  • 我注意到你用pull-to-refresh 标记了,这到底有什么关系?如果我们知道更多细节,可能会有更好的解决方案。
  • 背后的问题是 RecyclerView 在 SwipeRefreshLayout 内部。滑动有时会在错误的位置刷新。 IE。当列表不在顶部时。所以我只会在 RecyclerView 位于顶部时才允许刷新
  • 啊,我明白了。这很奇怪,我在RecyclerView 中没有这个问题,但可能是那些较大的项目。
  • 我发现,这个错误曾经发生在旧支持版本 (issuetracker.google.com/issues/37008297) 中,并且已修复。也许它正在发生,因为我使用的是 StaggeredGridLayout。 Idk,但谢谢!

标签: android android-recyclerview kotlin pull-to-refresh


【解决方案1】:

您可以创建一个RecyclerView.OnScrollListener,并跟踪它滚动了多少。

例如,您需要做的就是保留一个变量,并根据垂直滚动量使用 onScroll 更新它。

class MyScrollListener() : RecyclerView.OnScrollListener() {

    var currentScrollPosition = 0

    override fun onScrolled(view: RecyclerView, dx: Int, dy: Int) {
        currentScrollPosition += dy

        if( currentScrollPosition == 0 ) {
            // We're at the top
        }
    }
}

【讨论】:

  • 非常感谢!我唯一需要适应的是,当 RecyclerView 的项目更新时,我必须用 0 重新启动“当前位置”的值。
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多