android - LinearLayoutManager 平滑滚动跳转到错误位置

标签 android android-recyclerview smooth-scrolling linearlayoutmanager

我正在尝试制作类似于 Instagram 过滤器布局的布局。基本上,当您选择一个过滤器时,它会滚动到您选择的项目 + 1,向您显示还有更多过滤器。

我目前正在尝试为我的水平 RecyclerView 构建自定义 LinearLayoutManager:

public class LinearLayoutSnapManager extends LinearLayoutManager {
    private int mCurrentPos = 0;

    public LinearLayoutSnapManager(Context context) {
        super(context);
    }

    public LinearLayoutSnapManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    public LinearLayoutSnapManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

    }


    public void snap(RecyclerView rv, int position) {
        if (mCurrentPos == position) {
            // No move
            return;
        }

        boolean goingRight = true;
        if (position < mCurrentPos) {
            goingRight = false;
        }
        mCurrentPos = position;
        smoothScrollToPosition(rv, new RecyclerView.State(), goingRight ? getScrollRightPos(): getScrollLeftPos());
    }

    private int getScrollLeftPos() {
        int newPos = mCurrentPos - 1;
        return (newPos > 0) ? newPos : 0;
    }

    private int getScrollRightPos() {
        return mCurrentPos + 1;
    }
}

向左滚动按预期工作,但当我向右滚动时,它似乎只是跳到列表的末尾,而不是 newItem + 1,我不明白为什么会这样。

enter image description here

最佳答案

我在水平列表中的 onclicklistener 接口(interface)回调中调用我的 snap 方法。在调用界面之前,我正在设置所选项目,然后通知 View 已更改以更新当前状态。这导致布局管理器返回错误索引的所有问题。

我在创建一个空项目并测试我的逻辑后发现了这一点。令我惊讶的是工作正常,这让我能够找到真正的问题。

一旦我将 snaplogic 移动到我所有的 View 逻辑之前,一切都按预期工作,而我发布的代码没有任何变化。

希望这对以后的人有帮助。

关于android - LinearLayoutManager 平滑滚动跳转到错误位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40332956/

相关文章:

android - 操作栏图标和标题之间的间距。

Android:RecyclerView 的最后一张卡被切断。无法再滚动。为什么会这样?

java - RecyclerView不可见

android - ScrollToPosition() 在带有图像的 RecyclerView 上效果不佳

jQuery 在单页网站上平滑滚动

Android Volley 内存泄漏

android - 在 Android 中锁定短信

Android RecyclerView 空白

jquery - 如果在 .load() 事件处理程序中运行,smoothDivScroll 会失败

c# - WebView UWP 中的平滑滚动