提问者:小点点

(平滑)滚动到位置不能正常工作与RecyclerView


我正在使用带有GridLayoutManager的基本恢复视图。我观察到平滑ScrollToPopse和scrollToPoplace都不能正常工作。

a)当使用SmashScrollToPopse时,我经常收到来自RecyclerView的错误

"RecyclerView︰平滑滚动时越过目标位置。"

RecyclerView没有正确滚动(通常它会错过目标行)。这主要是在我尝试滚动到某一行的第一项时观察到的

b)当使用scrollToPopse时,它似乎工作得很好,但大多数情况下我只能看到行的第一项,其余的不显示。

你能给我一些提示,如何使工作正常的至少一个方法?

非常感谢!


共3个答案

匿名用户

终于我能够让它工作了!LinearLayoutManager. scrollToPositionWellOffset(int,int)做到了。

匿名用户

我也有同样的问题,但设法通过自定义SmoothScroller解决了这个问题

让自定义布局管理器如下

public class CustomLayoutManager extends LinearLayoutManager {
    private static final float MILLISECONDS_PER_INCH = 50f;
    private Context mContext;

    public CustomLayoutManager(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView,
        RecyclerView.State state, final int position) {

        LinearSmoothScroller smoothScroller = 
            new LinearSmoothScroller(mContext) {

            //This controls the direction in which smoothScroll looks
            //for your view
            @Override
            public PointF computeScrollVectorForPosition
            (int targetPosition) {
                return CustomLayoutManager.this
                    .computeScrollVectorForPosition(targetPosition);
            }

            //This returns the milliseconds it takes to 
            //scroll one pixel.
            @Override
            protected float calculateSpeedPerPixel
                (DisplayMetrics displayMetrics) {
                return MILLISECONDS_PER_INCH/displayMetrics.densityDpi;
            }
        };

        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }
}

(在上面给出的代码中留档注释)请将上述LayoutManager设置为回收视图

CustomLayoutManagerlayoutManager = new CustomLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.smoothScrollToPosition(position);

通过使用自定义布局管理器

scrollToPoplace在我的情况下也可以很好地使用

recyclerView.scrollToPosition(position)

此外,如果您想调整平滑ScrollToPopse的速度,请覆盖

private static final float MILLISECONDS_PER_INCH = 50f;

在CustomLayoutManager中。因此,如果我们将值设为1f,平滑ScrollToPoence会更快,就像scrollToPosion一样。增加值会延迟,减少会使滚动速度加快。希望这会有用。

匿名用户

在我的情况下,

mRecyclerView.scrollToPosition(10);

也没有工作。但是

mRecyclerView.smoothScrollToPosition(10);

对我来说很好…