如何通过特定像素以编程方式滚动 RecyclerView?

How to scroll the RecyclerView programatically by a specific pixels?

我扩展了 recyclerview,所以我可以缩放它。它按照我想要的方式工作,但现在我想以编程方式滚动 x 像素。这个用户故事是,如果我点击屏幕的上半部分,它应该滚动 x 个像素,同样会滚动到屏幕的下半部分。

这是我所做的:

Activity:

@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
    // if(mComicViewerFragment != null)
    //     mComicViewerFragment.consumeEvent(event);

    mScaleDetector.onTouchEvent(event);

    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
        int y = (int) event.getY();

        if(y >= mScreenSize.y / 2)
        {
            mComicViewerFragment.scrollBy((int)(mScreenSize.y * 0.10f));
            Log.i(ComicApplication.TAG, "ComicViewerActivity.onTouchEvent : You are tapping the lower part : " + y);
        }
        else
        {
            mComicViewerFragment.scrollBy((int)(-mScreenSize.y * 0.10f));
            Log.i(ComicApplication.TAG, "ComicViewerActivity.onTouchEvent : You are tapping the upper part : " + y);
        }
    }

    return super.dispatchTouchEvent(event);
}

片段

public void scrollBy(int by)
{
    mScalingRecyclerView.smoothScrollBy(0, by);
}

每次我点击,它都不会滚动 x 像素。这是因为我创建了一个从 RecyclerView 扩展的自定义视图吗?我应该在哪里正确调用 smoothScrollBy?这应该很容易,但我被卡住了。

由于 recyclerView.smoothScrollBy(0, pixels); 不适用于您的自定义视图,您可以尝试其他方法。

您可以通过做一些数学运算按位置滚动,但它不会精确到像素。

假设地说,如果您的项目具有 100dp 的相同高度,您可以通过代码将 dp 转换为任何屏幕类型的像素 see here

假设每个项目 100dp 达到 100px,并且您想向下滚动 Recycler 400px。那是 4 个位置 (400 / 100)。

然后你只需要当前在View bottom item的位置编号,加上4然后按位置滚动或平滑滚动。

这里有一个 helper class 向您展示如何在视图中获得顶部或底部项目位置,如果您希望在回收站中上下移动。

完整的解决方案Check here