在RecyclerView中快速滚动

我正在尝试使用新的RecyclerView类来实现这样一种场景,即我希望组件在滚动时捕捉到特定元素(旧的AndroidGallery就是这样一个带有中心锁定项的列表的示例)

这就是我目前采取的方法:

我有一个接口,IsNappylayYoutManager,其中包含一个方法,getPositionForVelocity,该方法根据初始的滚动速度计算视图应该在哪个位置结束滚动

公共界面是应用程序管理器{
int-getPositionForVelocity(int-velocityX,int-velocityY);
}

然后我有一个类,SnappyRecyclerView,它将RecyclerView子类化,并重写它的fling()方法,以便以正确的方式抛出视图:

公共最终类SnappyRecyclerView扩展了RecyclerView{
/**删除其他方法**/
@凌驾
公共布尔触发器(int-velocityX,int-velocityY){
LayoutManager lm=getLayoutManager();
if(IsNappylayYoutManager的lm实例){
super.smoothScrollToPosition(((IsNappylayYoutManager)getLayoutManager())
.getPositionForVelocity(velocityX,velocityY));
}
返回true;
}
}

出于几个原因,我对这种方法不太满意。首先,必须对“RecyclerView”进行子类化以实现某种类型的滚动,这似乎与“RecyclerView”的理念背道而驰。其次,如果我只想使用默认的LinearLayoutManager,这会变得有点复杂,因为我必须搞乱它的内部结构,以便了解它当前的滚动状态并准确计算出它滚动到的位置。最后,这甚至没有考虑所有可能的滚动场景,就像移动列表,然后暂停,然后抬起手指,不会发生投掷事件(速度太低),因此列表仍处于中间位置。这可以通过在RecyclerView中添加一个滚动状态侦听器来解决,但这也让人感觉非常不舒服

我觉得我一定错过了什么。有更好的方法吗

有了LinearSnapHelper,现在就很容易了

您需要做的就是:

SnapHelper=newlinearsnaphelper();
helper.attachToRecyclerView(recyclerView);

就这么简单!请注意,LinearSnapHelper从版本24.2.0开始添加到支持库中

这意味着您必须将其添加到应用程序模块的build.gradle

编译“com.android.support:recyclerview-v7:24.2.0”

编辑:AndroidX LinearSnapHelper

发表评论