我正在尝试使用新的 RecyclerView
类用于我希望组件在滚动时捕捉到特定元素的场景(旧的 Android Gallery
是带有中心锁定项的此类列表的示例)。
这是我目前采用的方法:
我有一个接口(interface),ISnappyLayoutManager
,其中包含一个方法,getPositionForVelocity
,它计算给定初始 throw 速度的 View 应该在哪个位置结束滚动。
public interface ISnappyLayoutManager {
int getPositionForVelocity(int velocityX, int velocityY);
}
然后我有课,SnappyRecyclerView
, 子类 RecyclerView
并覆盖其 fling() 方法,以便将 View 准确地转换到正确的数量:
public final class SnappyRecyclerView extends RecyclerView {
/** other methods deleted **/
@Override
public boolean fling(int velocityX, int velocityY) {
LayoutManager lm = getLayoutManager();
if (lm instanceof ISnappyLayoutManager) {
super.smoothScrollToPosition(((ISnappyLayoutManager) getLayoutManager())
.getPositionForVelocity(velocityX, velocityY));
}
return true;
}
}
出于几个原因,我对这种方法不太满意。首先,似乎与“RecyclerView”的理念背道而驰,必须对其进行子类化以实现某种类型的滚动。其次,如果我只想使用默认的 LinearLayoutManager
,这变得有些复杂,因为我必须弄乱它的内部结构才能了解它当前的滚动状态并准确计算出它滚动到的位置。最后,这甚至没有考虑到所有可能的滚动场景,就像你移动列表然后暂停然后抬起手指一样,没有发生弹跳事件(速度太低),所以列表保持在中途位置。这可以通过向 RecyclerView
添加滚动状态监听器来解决。 ,但这也让人觉得很hacky。
我觉得我一定错过了什么。有没有更好的方法来做到这一点?
最佳答案
与 LinearSnapHelper
,现在这很容易。
您需要做的就是:
SnapHelper helper = new LinearSnapHelper();
helper.attachToRecyclerView(recyclerView);
就这么简单!请注意,LinearSnapHelper
从版本 24.2.0 开始添加到支持库中。
意味着您必须将其添加到您的应用模块的 build.gradle
compile "com.android.support:recyclerview-v7:24.2.0"
编辑:AndroidX LinearSnapHelper
关于android - RecyclerView 中的快速滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370289/