android - RecyclerView 中的快速滚动

标签 android android-recyclerview

我正在尝试使用新的 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/

相关文章:

Android SortedList 删除方法正在跳过项目

java - DatabaseException : Can't convert object of type java. lang.String 类型 StreetClass

android - 在 CoordinatorLayout 上以编程方式隐藏/显示工具栏

javascript - Cordova BarcodeScanner 连续读取

android - 通过 Facebook 应用程序在移动浏览器中登录 Facebook

android - 启动时发布 APK 崩溃 - React Native

fragment 内的Android TabLayout

android - 有没有RecyclerView等价于ListView的transcriptMode alwaysScroll?

android - 在 PagedList 获取新数据时收到通知

Android将经度转换为ExifInterface的GPS标签