(平滑)ScrollToPosition无法正确使用RecyclerView

我正在使用GridLayoutManager的基本RecyclerView。 我观察到,smoothScrollToPosition和scrollToPosition也不能正常工作。

a)使用smoothScrollToPosition我经常收到来自RecyclerView错误

“RecyclerView:通过目标位置,同时平滑滚动。”

而且RecyclerView没有正确滚动(经常会错过目标行)。 这主要是当我试图滚动到某一行的第一项时

b)当使用scrollToPosition它似乎工作相当好,但大部分时间,我只能看到行的第一项,其余不显示。

你能给我一些提示,如何正确工作,至less有一种方法?

非常感谢!

Solutions Collecting From Web of "(平滑)ScrollToPosition无法正确使用RecyclerView"

最后我能够使它工作! LinearLayoutManager.scrollToPositionWithOffset(int, int)做了诀窍。

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

让自定义布局pipe理器如下

 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设置为recyerview

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

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

scrollToPosition也适用于我可以使用的情况

 recyclerView.scrollToPosition(position) 

如果你想调整smoothScrollToPosition的速度,请覆盖

 private static final float MILLISECONDS_PER_INCH = 50f; 

在CustomLayoutManager中。 所以如果我们把这个值设置为1f ,smoothScrollToPosition将会像scrollToPosition.increasing值那样更快,延迟和减小会使滚动速度变快。 希望这会有用。

从RecyclerView的任何位置向下滚动到底部,单击EditText。

 edittext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { rv_commentList.postDelayed(new Runnable() { @Override public void run() { rv_commentList.scrollToPosition(rv_commentList.getAdapter().getItemCount() - 1); } }, 1000); } }); 

在我的情况下,

 `mRecyclerView.scrollToPosition(10);` 

也没有工作。 但

 `mRecyclerView.smoothScrollToPosition(10);` 

适合我…

调用recyclerView smoothScroll无效,因为recyclerView本身不处理其布局。

你应该做的是调用布局pipe理器滚动方法。

这应该看起来像这样

 mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition); 

尝试测量项目的宽度或高度,并调用smoothScrollBy(int dx,int dy)。