与AppBarLayout配对时,我在使用RecyclerView实现平滑滚动时遇到问题。这是我的布局:
<CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#ff0000"
app:layout_scrollFlags="scroll|enterAlways|snap" />
</AppBarLayout>
<RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</CoordinatorLayout>
我尝试滚动到这样的位置:
RecyclerView.SmoothScroller ss = new LinearSmoothScroller(getActivity()) {
@Override protected int getVerticalSnapPreference() {
return LinearSmoothScroller.SNAP_TO_END;
}
};
ss.setTargetPosition(position);
llm.startSmoothScroll(ss);
有两个问题:
如果目标位置不在回收者视图的下边缘,则滚动量不正确 - 它会被AppBarLayout的高度偏移。如果我更改为SNAP_TO_START
,那么它可以正常工作。或者,如果我删除AppBarLayout,它在所有情况下都可以正常工作。
尝试滚动到回收器视图中的最后一个元素会以其他方式中断。 SNAP_TO_START
标志通常可以正常工作(参见#1),但在这种情况下,回收者视图拒绝完全滚动它。
因此删除AppBarLayout会修复所有问题,在AppBarLayout中使用它时是否需要一些额外的设置?我正在使用最新的支持库版本。
由于
答案 0 :(得分:0)
请使用smoothScrollToPosition
解决您的问题,如下所示。
RecyclerView rv = (RecyclerView)findViewById(R.id.recyclerView);
rv.smoothScrollToPosition(mMessages.count-1);
答案 1 :(得分:0)
第一个解决方案是
@Override
public int calculateDyToMakeVisible(View view, int snapPreference) {
return super.calculateDyToMakeVisible(view, snapPreference) - offset;
}
偏移量可能是
offset = getActionBarHeight(context);
public int getActionBarHeight(@NonNull Context context) {
final TypedArray ta = context.getTheme().obtainStyledAttributes(
new int[] {android.R.attr.actionBarSize});
int actionBarHeight = (int) ta.getDimension(0, 0);
return actionBarHeight;
}
第二种解决方案是将app:layout_scrollFlags =“ scroll | enterAlways”替换为app:layout_scrollFlags =“ enterAlways”以防止actionBar隐藏 p>