背景

过去,我曾问过如何为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'


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



发生的错误是,拖动快速滚动条时(拖动的内容)会不时跳到其他位置(报告为here)。

我尝试过的

我试图找出原因,并找出RecyclerView中发生了哪些变化可能导致此问题。

我也曾尝试报告(here),但Google告诉我在这里询问。

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

问题

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

最佳答案

碰巧的是,我只是使用了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
}


我猜想原因是/不是在22.x以下调用了onScrolled,而是现在...

08-04 06:58