【问题标题】:How to add fast-scroller correctly for the RecyclerView for the newer versions of it?如何为 RecyclerView 的较新版本正确添加快速滚动条?
【发布时间】:2015-09-25 13:34:38
【问题描述】:

背景

过去,我问过如何为 RecyclerView (here) 创建一个快速滚动条,并找到了添加它的方法,我什至发布了它,包括一个 Github 项目 (here )。

问题

从特定的支持库版本开始,事情变得有问题。我制作的库可以正常工作:

compile 'com.android.support:recyclerview-v7:21.0.3'
compile 'com.android.support:appcompat-v7:21.0.3'

但不是这个:

compile 'com.android.support:recyclerview-v7:22.2.0'
compile 'com.android.support:appcompat-v7:22.2.0'

这是它过去如何工作的示例:

出现的BUG是在拖拽快速滚轮的时候,它(你拖的东西)时不时会跳到其他地方(据报道here)。

我尝试过的

我尝试找出导致此问题的原因,并找出 RecyclerView 中可能导致此问题的更改。

我也尝试过举报 (here),但 Google 让我在这里询问。

很遗憾,我找不到原因。

问题

如何解决这个问题,让代码再次正常工作?

【问题讨论】:

  • `它时不时跳到其他地方`跳什么,轨道还是列表?您如何跟踪这些职位?您应该只调试并查看为什么您的句柄移动,您收到的回调和堆栈跟踪等。
  • @yigit 请检查我提供的链接和我写的内容。他们有更多的信息可以放在这里。跳跃的行为是快速滚动器本身(你拖动的)。
  • 我看到的唯一有用的东西是 setBubbleAndHandlePosition 以非常高的值调用。简要检查您的源代码表明您正在从事件中获取它,但您忽略了事件指针等。您的事件跟踪可能是错误的。我建议检查 ItemTouchHelper 的事件处理。
  • @yigit 似乎合乎逻辑。但是为什么它可以在以前版本的支持库上工作,而现在却不行呢?

标签: android android-support-library android-recyclerview fast-scroller


【解决方案1】:

真巧,我刚用了你的 FastScroller 也遇到了同样的问题,我也用 22.2.0。

我要测试的列表大约有 150 个项目,当我慢慢滚动时,我看到手柄中有小跳动和气泡。

一些调试发现,当我拖动手柄时,方法setBubbleAndHandlePosition()是从onTouch和onScrolled调用的。

问题在于 onScrolled 根据顶行计算句柄的“完美”位置。这会导致与触摸握持手柄不同的位置。

我的解决方案非常简单,如果句柄处于“拖动”模式,我会通过检查 isSelected() 来检查 onScrolled(),并防止对 onScrolled() 进行进一步计算。

@Override
public void onScrolled(RecyclerView rv, int dx, int dy)
{
    // only react on scroll events when not done by moving the handle by touch
    // prevents nervous jumping of the handle
    if (handle.isSelected())
    {
        return;
    }
    // rest code of onScrolled is unchanged
}

我猜原因是/是 onScrolled 在 22.x 以下没有被调用,但现在......

【讨论】:

  • 所以这是因为调用了2个方法来改变句柄的位置?滚动和触摸?如果手柄被拖动,你让它忽略滚动?
  • 好像解决了这个问题,但现在又引发了一个新问题:尝试拖动快速滚动条。现在停止并沿您拖动的方向滚动。滚动有小跳跃。有时甚至在另一个方向。我想知道为什么这次它有问题。
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 2016-02-20
相关资源
最近更新 更多