由于工具栏上的自动隐藏,RecyclerView未显示第一个列表项

时间:2016-06-04 18:36:31

标签: java android android-recyclerview toolbar

所以我设置了工具栏,当用户使用以下代码在RecyclerView上滚动列表时自动隐藏:

public final class RecyclerViewUtils {


    public static class ShowHideToolbarOnScrollingListener extends RecyclerView.OnScrollListener {
        public static final String SHOW_HIDE_TOOLBAR_LISTENER_STATE = "show-hide-toolbar-listener-state";


        // The elevation of the toolbar when content is scrolled behind
        private static final float TOOLBAR_ELEVATION = 14f;

        private Toolbar toolbar;
        private State state;

        public ShowHideToolbarOnScrollingListener(Toolbar toolbar) {
            this.toolbar = toolbar;
            this.state = new State();
        }

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        private void toolbarSetElevation(float elevation) {
            if (AndroidUtils.isLollipop()) {
                toolbar.setElevation(elevation == 0 ? 0 : TOOLBAR_ELEVATION);
            }
        }

        private void toolbarAnimateShow(final int verticalOffset) {
            toolbar.animate()
                    .translationY(0)
                    .setInterpolator(new LinearInterpolator())
                    .setDuration(180)
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            toolbarSetElevation(verticalOffset == 0 ? 0 : TOOLBAR_ELEVATION);
                        }
                    });
        }

        private void toolbarAnimateHide() {
            toolbar.animate()
                    .translationY(-toolbar.getHeight())
                    .setInterpolator(new LinearInterpolator())
                    .setDuration(180)
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            toolbarSetElevation(0);
                        }
                    });
        }

        @Override
        public final void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                if (state.scrollingOffset > 0) {
                    if (state.verticalOffset > toolbar.getHeight()) {
                        toolbarAnimateHide();
                    } else {
                        toolbarAnimateShow(state.verticalOffset);
                    }
                } else if (state.scrollingOffset < 0) {
                    if (toolbar.getTranslationY() < toolbar.getHeight() * -0.6 && state.verticalOffset > toolbar.getHeight()) {
                        toolbarAnimateHide();
                    } else {
                        toolbarAnimateShow(state.verticalOffset);
                    }
                }
            }
        }

        @Override
        public final void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            state.verticalOffset = recyclerView.computeVerticalScrollOffset();
            state.scrollingOffset = dy;
            int toolbarYOffset = (int) (dy - toolbar.getTranslationY());
            toolbar.animate().cancel();
            if (state.scrollingOffset > 0) {
                if (toolbarYOffset < toolbar.getHeight()) {
                    if (state.verticalOffset > toolbar.getHeight()) {
                        toolbarSetElevation(TOOLBAR_ELEVATION);
                    }
                    toolbar.setTranslationY(state.translationY = -toolbarYOffset);
                } else {
                    toolbarSetElevation(0);
                    toolbar.setTranslationY(state.translationY = -toolbar.getHeight());
                }
            } else if (state.scrollingOffset < 0) {
                if (toolbarYOffset < 0) {
                    if (state.verticalOffset <= 0) {
                        toolbarSetElevation(0);
                    }
                    toolbar.setTranslationY(state.translationY = 0);
                } else {
                    if (state.verticalOffset > toolbar.getHeight()) {
                        toolbarSetElevation(TOOLBAR_ELEVATION);
                    }
                    toolbar.setTranslationY(state.translationY = -toolbarYOffset);
                }
            }
        }

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public void onRestoreInstanceState(State state) {
            this.state.verticalOffset = state.verticalOffset;
            this.state.scrollingOffset = state.scrollingOffset;
            if (AndroidUtils.isLollipop()) {
                toolbar.setElevation(state.elevation);
                toolbar.setTranslationY(state.translationY);
            }
        }

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public State onSaveInstanceState() {
            state.translationY = toolbar.getTranslationY();
            if (AndroidUtils.isLollipop()) {
                state.elevation = toolbar.getElevation();
            }
            return state;
        }

        /**
         * Parcelable RecyclerView/Toolbar state for simpler saving/restoring its current state.
         */
        public static final class State implements Parcelable {
            public static Creator<State> CREATOR = new Creator<State>() {
                public State createFromParcel(Parcel parcel) {
                    return new State(parcel);
                }

                public State[] newArray(int size) {
                    return new State[size];
                }
            };

            // Keeps track of the overall vertical offset in the list
            private int verticalOffset;
            // Determines the scroll UP/DOWN offset
            private int scrollingOffset;
            // Toolbar values
            private float translationY;
            private float elevation;

            State() {
            }

            State(Parcel parcel) {
                this.verticalOffset = parcel.readInt();
                this.scrollingOffset = parcel.readInt();
                this.translationY = parcel.readFloat();
                this.elevation = parcel.readFloat();
            }

            @Override
            public int describeContents() {
                return 0;
            }

            @Override
            public void writeToParcel(Parcel parcel, int flags) {
                parcel.writeInt(verticalOffset);
                parcel.writeInt(scrollingOffset);
                parcel.writeFloat(translationY);
                parcel.writeFloat(elevation);
            }
        }
    }

    private RecyclerViewUtils() {
    }
}

现在因为工具栏没有固定的高度,所以列表中的第一个项目没有显示,因为工具栏在它上面。我怎样才能解决这个问题?有人有这样的问题吗?

我试图将recyclerview的上边距设置为actionbarsize,然后显示第一项,但滚动时我看到屏幕顶部只有一个空白空格。

0 个答案:

没有答案