如何为RecyclerView正确添加快速滚动条以获得更新版本的快速滚动条?

时间:2015-07-07 20:59:35

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

背景

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

问题

从特定的支持库版本开始,事情变得越来越糟糕。我做的图书馆工作正常:

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'

以下是过去工作方式的示例:

enter image description here

发生的错误是,当拖动快速滚动条时,它(您拖动的内容)会不时跳到其他地方(报告here)。

我尝试了什么

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

我也尝试过报道(here),但谷歌告诉我在这里问一下。

可悲的是,我找不到原因。

问题

如何解决此问题,并使代码再次正常工作?

1 个答案:

答案 0 :(得分:1)

多么巧合,我刚刚使用你的FastScroller并遇到了同样的问题,我也使用了22.2.0。

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

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

问题在于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以下但是现在......