【问题标题】:Recyclerview: callback for view when fully visibleRecyclerview:完全可见时的视图回调
【发布时间】:2016-02-11 09:53:30
【问题描述】:

这是用例:

我有一个包含 5 个食品图像视图的回收站视图列表:

  1. 西瓜
  2. 芒果
  3. 桃子
  4. 苹果
  5. 番石榴

当用户滚动经过时,当桃子图像视图在回收器视图中完全可见时,我想记录输出 (Log.e(TAG, "Peach shown!")

当视图在 recyclerview 中完全可见时,是否会调用回调?差点想把方法findFirstCompletelyVisibleItemPosition ()变成回调方法:http://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager.html#findFirstCompletelyVisibleItemPosition()

我读了这个帖子: RecyclerView - callback when view is no longer visible 并查看了此处的文档 http://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnChildAttachStateChangeListener.html 但我看到回调方法 onChildViewAttachedToWindow() 在以下情况下被调用:

当视图附加到 RecyclerView 时调用。

附加可以在视图实际显示之前。

我能想到一种效率极低的方法:

  1. 在您的回收站视图上设置RecyclerView.OnScrollListener

  2. onScrolled 方法中调用mLinearLayoutManager.findFirstCompletelyVisibleItemPosition()。检查返回等于 3 的 int。

recyclerview 每次滚动,都会执行数百次计算。

【问题讨论】:

  • 也许 toWindow() 和 toRecyclerview 不一样。
  • @Simon:你是怎么解决这个问题的?只调用一次?

标签: android listener android-recyclerview


【解决方案1】:

正如您所提到的,您实际上应该在onScrolled() 方法中处理它。 findFirstCompletelyVisibleItemPosition() 方法非常有效,并且正在进行的计算不会影响大多数设备,包括低端设备。

附带说明,我认为您想要的是 findLastCompletelyVisibleItemPosition() 方法。

去过那里,做到了:-)

【讨论】:

  • 好的。让我今天晚些时候试试。
  • 我试过这个方法,但是当它滚动通过桃子图像视图时它会调用日志几次。我只希望它被调用一次。你知道我怎样才能让它只调用一次吗?
  • 这有几种模式,具体取决于您想要实现的目标。基本上,您需要在获得正确的 CompletelyVisibleItem 后触发“锁定条件”,然后在其他条件下将其重置(更改列表元素计数、到达列表末尾、退出 Activity/Fragment)。但同样,这是非常特定于实现的,如果不知道您的确切目标是什么,我无法为您提供单一解决方案:-)
  • 我使用 RxJava 来让它触发一次。创建一个注册滚动侦听器的可观察对象,获取每个滚动上的第一个和最后一个可见位置,返回一个位置范围。使用scan() 跟踪当前和以前的范围。最后,检查您的目标是否在当前范围内,而不是前一个范围内。 take(1) ,它将在第一场比赛后完成并清理。
猜你喜欢
  • 2015-10-19
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多