Show/Hide 滚动 RecyclerView 时使用 LinearLayout?

Show/Hide LinearLayout when scrolling a RecyclerView?

我的 MainActivity 中加载了一个片段。在片段的布局之上,我有一个 LinearLayout,我想在用户滚动时 show/hide up/down。

这可以使用 Coordinator 布局实现吗,还是我需要自己破解?

layout.xml:

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ececec">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/discoverRView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="5dp"
            android:paddingRight="5dp">

        </android.support.v7.widget.RecyclerView>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#f00"
            app:layout_anchor="@+id/discoverRView"
            app:layout_anchorGravity="top"
            app:layout_scrollFlags="scroll"
            >

         </LinearLayout>



    </android.support.design.widget.CoordinatorLayout>

也许有更好的解决方案,但这可以通过创建自定义 CoordinatorLayout.Behavior 并将其添加到 CustomLinearLayout:

来实现
//This is taken from a project of mine, it scrolls a Layout up if a snackbar shows up. 

public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> {

    public MoveUpwardBehavior(){
        //super();
    }

    public MoveUpwardBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
        child.setTranslationY(translationY);
        return true;
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof Snackbar.SnackbarLayout;
    }
    @Override
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) {
        super.onDependentViewRemoved(parent, child, dependency);
        child.setTranslationY(0);
    }
}

您需要自定义 LinearLayout,但这部分很简单:

@CoordinatorLayout.DefaultBehavior(MoveUpwardBehavior.class)
public class CustomLinearLayout extends LinearLayout {

    public CustomLinearLayout(Context context) {
        super(context);
    }

    public CustomLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
}

当然,您需要在 xml:

中使用此布局
<com.your.project.CustomLinearLayout
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="#f00"
    app:layout_anchor="@+id/discoverRView"
    app:layout_anchorGravity="top">
    </com.your.project.CustomLinearLayout>

所以,我想你明白了。您需要根据 RecyclerView 的滚动更新行为。如果您需要更多帮助,我可以尝试构建一个工作示例。