简体   繁体   中英

Detect top of RecyclerView which has more than one column?

I have RecyclerView above that i have an AppBarLayout whose height is larger than 255 px. When user scrolls RecyclerView, AppBarLayout has an fling issue. To avoid that i decided to expand AppBarLayout manually. My RecyclerView made of GridLayoutManager with span of 3. I used below code to listen RecyclerView top reach

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                int firstVisiblePosition = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
                if (firstVisiblePosition == 0) {
                    appBarLayout.setExpanded(true, true);
                }
            }
        }
    });

But issue is that now i can't scroll up the recyclerview

one possible solution is to scroll app bar with animation.

 if (mIsAppBarExpanded) {
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
        final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
        if (behavior != null) {
            ValueAnimator valueAnimator = ValueAnimator.ofInt();
            valueAnimator.setInterpolator(new DecelerateInterpolator());
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
                    mAppBarLayout.requestLayout();
                }
            });
            valueAnimator.setIntValues(0, -mAppBarLayout.getTotalScrollRange());
            valueAnimator.setDuration(400);
            valueAnimator.start();
        }
    }

TO check app bar already collapsed or not

 mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            mIsAppBarExpanded = Math.abs(verticalOffset) != appBarLayout.getTotalScrollRange();
        }
    });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM