背景
过去,我曾问过如何为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,而是现在...