RecyclerView startSmoothScroll()与AppBarLayout的滚动量不正确?

时间:2017-07-05 18:04:07

标签: android

与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);

有两个问题:

  1. 如果目标位置不在回收者视图的下边缘,则滚动量不正确 - 它会被AppBarLayout的高度偏移。如果我更改为SNAP_TO_START,那么它可以正常工作。或者,如果我删除AppBarLayout,它在所有情况下都可以正常工作。

  2. 尝试滚动到回收器视图中的最后一个元素会以其他方式中断。 SNAP_TO_START标志通常可以正常工作(参见#1),但在这种情况下,回收者视图拒绝完全滚动它。

  3. 因此删除AppBarLayout会修复所有问题,在AppBarLayout中使用它时是否需要一些额外的设置?我正在使用最新的支持库版本。

    由于

2 个答案:

答案 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隐藏