Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义CoordinatorLayout.Behavior和RecyclerView滚动问题_Android_Android Recyclerview_Coordinator Layout - Fatal编程技术网

Android 自定义CoordinatorLayout.Behavior和RecyclerView滚动问题

Android 自定义CoordinatorLayout.Behavior和RecyclerView滚动问题,android,android-recyclerview,coordinator-layout,Android,Android Recyclerview,Coordinator Layout,我有一个带有两个孩子的协调布局,一个充当标题的视图,以及一个回收视图: <android.support.design.widget.CoordinatorLayout android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@

我有一个带有两个孩子的
协调布局
,一个充当标题的
视图
,以及一个
回收视图

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        app:layout_behavior="some.package.AlphaBehavior">

        <ImageView
            android:id="@+id/header_iv"
            style="@style/some_style"/>

        <TextView
            android:id="@+id/header_retails_tv"
            style="@style/some_style_tv"
            android:text="@string/some_text"/>

        </LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false" />

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

但我面临一个问题:如果用户使scroll非常快,则行为事件调用不正确。
scrollY
成员与总滚动不相关,并且
totalScrollY
成员(从
RecyclerView
计算滚动获得)不正确。甚至我试图在
onStopNestedScroll
事件中找到
firstCompletelyVisibleItem
,但当
recyclerView
到达列表的开始位置时,它返回位置2或3。

最后,我用一个
OnScrollListener
解决了这个问题,而不是用
协调器来进行布局。行为,它就像一个魔咒一样工作。我把代码放在这里,也许对某人有用:

自定义onScrollListener以隐藏视图:

public class HideViewOnScrollListener extends RecyclerView.OnScrollListener {

    private float alpha = 1.f;
    private float scrolly = 0.f;

    private int heightViewToHide;
    private final View viewToHide;

    public HideViewOnScrollListener(View viewToHide) {
        this.viewToHide = viewToHide;

        heightViewToHide = viewToHide.getHeight();
        if (heightViewToHide == 0) {

            ViewTreeObserver viewTreeObserver = viewToHide.getViewTreeObserver();
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {

                    heightViewToHide = viewToHide.getHeight();

                    if (heightViewToHide > 0)
                        viewToHide.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });
        }

    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        scrolly += dy;

        alpha = (heightViewToHide - scrolly) / heightViewToHide;

        if (alpha < 0.f) alpha = 0.f;
        if (alpha > 1.0f) alpha = 1.f;

        if (dy < 0 && scrolly > heightViewToHide) {
            alpha = 0.f;
        }

        viewToHide.setAlpha(alpha);
    }
}
请查一下伊恩·莱克的。
public class HideViewOnScrollListener extends RecyclerView.OnScrollListener {

    private float alpha = 1.f;
    private float scrolly = 0.f;

    private int heightViewToHide;
    private final View viewToHide;

    public HideViewOnScrollListener(View viewToHide) {
        this.viewToHide = viewToHide;

        heightViewToHide = viewToHide.getHeight();
        if (heightViewToHide == 0) {

            ViewTreeObserver viewTreeObserver = viewToHide.getViewTreeObserver();
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {

                    heightViewToHide = viewToHide.getHeight();

                    if (heightViewToHide > 0)
                        viewToHide.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });
        }

    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        scrolly += dy;

        alpha = (heightViewToHide - scrolly) / heightViewToHide;

        if (alpha < 0.f) alpha = 0.f;
        if (alpha > 1.0f) alpha = 1.f;

        if (dy < 0 && scrolly > heightViewToHide) {
            alpha = 0.f;
        }

        viewToHide.setAlpha(alpha);
    }
}
recyclerView.addOnScrollListener(new HideViewOnScrollListener(viewToHide));