1

我有一些问题。当recyclerview包含少量项目时(1,2,3,4),工具栏隐藏。这是不想要的行为。当recyclerview有一个项目时防止隐藏工具栏

当recyclerview只有几个项目,并且recyclerview上没有滚动时,我该如何防止工具栏隐藏?

main_recyclerview.xml

GIF showing the problem

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:elevation="1dp" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    > 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     android:elevation="1dp" 
     android:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
     app:layout_scrollFlags="scroll|enterAlways" 
     /> 


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

    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/activity_main_swipe_refresh_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     > 


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

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

    </android.support.v4.widget.SwipeRefreshLayout> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="end|bottom" 
    android:layout_margin="16dp" 
    android:elevation="1dp" 
    android:onClick="addCity" 
    android:src="@drawable/ic_plus_white_36dp" 
    app:borderWidth="0dp" /> 

回答

1

也许你需要防止RecyclerView从调度滚动事件到其父母。

 private class NoScrollTouchListener implements RecyclerView.OnTouchListener{ 
      private static final int MAX_CLICK_DURATION = 200; 
      private long mStartClickTime; 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: { 
         mStartClickTime = SystemClock.currentThreadTimeMillis(); 
         break; 
        } 
        case MotionEvent.ACTION_UP: { 
         long clickDuration = SystemClock.currentThreadTimeMillis() - mStartClickTime; 
         if(clickDuration <= MAX_CLICK_DURATION) { 
          return false; 
         } 
        } 
       } 
       if(v instanceof RecyclerView){ 
        boolean isLastVisible = ((LinearLayoutManager)((RecyclerView) v).getLayoutManager()).findLastCompletelyVisibleItemPosition() == ((RecyclerView) v).getAdapter().getItemCount() - 1); 

    boolean isFirstVisible = ((LinearLayoutManager)((RecyclerView) v).getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 0); 
        return isLastVisible && isFirstVisible; 
       } 
       return true; 
      } 
     } 

这可能不是正确的做法,但它具有简洁的条件,当RecyclerView不需要滚动。

((LinearLayoutManager)mRecyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition() == mRecyclerView.getAdapter().getItemCount() - 1); 

参见requestDisallowInterceptTouchEvent(disallow) RecyclerView父(即CoordinatorLayout

的另一种方式,试图阻止任何滚动行为是将数据观察者注册到RecyclerView.Adapter和使用上述条件切换您Toolbarlayout_scrollFlags

 boolean isLastVisible = ((LinearLayoutManager)((RecyclerView) v).getLayoutManager()).findLastCompletelyVisibleItemPosition() == ((RecyclerView) v).getAdapter().getItemCount() - 1); 

    boolean isFirstVisible = ((LinearLayoutManager)((RecyclerView) v).getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 0); 

       if(isFirstVisible && isLastVisible){ 
        mOldScrollFlags = mOldScrollFlags == -1 ? params.getScrollFlags() : mOldScrolFlags; 
        params.setScrollFlags(0); 
       }else{ 
        params.setScrollFlags(mOldScrollFlags); 
       } 
       mToolbar.setLayoutParams(params); 

当您将滚动标志设置为0时,AppBarLayout会将该视图排除在总灵活范围内计算它。

+0

mOldScrollFlags的初始值是什么? –

+0

'mOldScrollFlags = mOldScrollFlags == -1? params.getScrollFlags():mOldScrolFlags;'如你所愿。 :) –