0

У меня есть RecyclerView выше, у меня есть AppBarLayout, высота которого превышает 255 px. Когда пользователь прокручивает RecyclerView, AppBarLayout имеет проблему сбрасывания. Чтобы избежать этого, я решил вручную развернуть AppBarLayout. Мой RecyclerView сделан из GridLayoutManager с пролетом 3. я использовал ниже код, чтобы слушать RecyclerView топ достигаетОпределите верхнюю часть RecyclerView, которая имеет более одного столбца?

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

Но проблема в том, что теперь я не могу прокрутить recyclerview

ответ

0

один из возможных решений являются для прокрутки приложения бар с анимацией.

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(); 
     } 
    } 

Чтобы проверить приложение бар уже разрушилась или не

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