7

Tôi đang sử dụng bố cục sau trong project.Its của tôi làm việc tốt nhưng CollapsingToolbarLayout bị thu gọn ngay cả khi RecyclerView trống hoặc RecyclerView có rất ít mục. Hành vi mà tôi muốn là, CollapsingToolbarLayout sẽ chỉ thu gọn khi RecyclerView có các mục lớn hơn các mục hiển thị. Làm thế nào tôi có thể đạt được hành vi này?CollapsingToolbarLayout không được thu gọn khi RecyclerView rỗng

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/coordinator_layout" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fitsSystemWindows="true"> 

     <android.support.design.widget.AppBarLayout 
      android:id="@+id/app_bar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:fitsSystemWindows="true" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

      <android.support.design.widget.CollapsingToolbarLayout 
       android:id="@+id/collapsing_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:fitsSystemWindows="true" 
       app:contentScrim="?attr/colorPrimary" 
       app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

       <include 
        layout="@layout/header" 
        android:fitsSystemWindows="true" 
        app:layout_collapseMode="parallax"/> 

       <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        app:layout_collapseMode="pin" 
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 
      </android.support.design.widget.CollapsingToolbarLayout> 
     </android.support.design.widget.AppBarLayout> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

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

Hi Vivart, nhớ để đối mặt với cùng một vấn đề. Nếu bạn có vấn đề cố định, vui lòng chia sẻ ý tưởng của bạn. Cảm ơn –

+0

tôi cũng thực hiện tương tự nhưng tiếc là barlayout sụp đổ của tôi là không sụp đổ. không bao giờ. nhìn vào câu hỏi của tôi - http://stackoverflow.com/questions/33093066/collapsing-bar-layout-and-recyclerview –

Trả lời

-2

Hãy thử thay đổi xml collapsingBarLayout của bạn để:

<android.support.design.widget.CollapsingToolbarLayout 
        android:id="@+id/collapsing_toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:fitsSystemWindows="true" 
        app:contentScrim="?attr/colorPrimary" 
app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlways|enterAlwaysCollapsed"> 

Tôi đã thêm 2 lá cờ thêm: enterAlways và enterAlwaysCollapsed. Đây không phải là giải pháp làm việc 100% nhưng tốt hơn là hành vi hiện tại của bạn.

0

nó một lỗi được biết đến. Cập nhật thư viện Hỗ trợ của bạn thành 22..2.1:

com.android.support:design:22.2.1 
+3

Issue vẫn còn hiện diện trong phiên bản 23.1.0. – Longi

+0

Ai đó có liên kết lỗi? – Eefret

+3

Vẫn còn lỗi này ... với 23.1.1 – Blunderer

0

Nếu điều này vẫn còn liên quan, tôi nghĩ mình đã đạt được hành vi mong muốn.

Trước hết, để bật/tắt di chuyển, chúng ta phải thực hiện một tùy chỉnh LinearLayoutManager (nhờ this post):

public class CustomLayoutManager extends LinearLayoutManager { 

    private boolean isScrollEnabled = true; 

    public CustomLayoutManager(Context context) { 
     super(context); 
    } 

    public void setScrollEnabled(boolean flag) { 
     this.isScrollEnabled = flag; 
    } 

    @Override 
    public boolean canScrollVertically() { 
     return isScrollEnabled && super.canScrollVertically(); 
    } 
} 

và đặt nó vào RecyclerView:

layoutManager = new CustomLayoutManager(this); 
recyclerView.setLayoutManager(layoutManager); 

Sau đó chúng tôi cần phát hiện, khi nào cần bật và khi nào thì tắt cuộn. Tôi đã làm điều đó với một AppBarLayout.OnOffsetChangedListener:

appBarLayout = mainView.findViewById(R.id.app_bar_layout); 
appBarLayout .addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
    @Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
     // verticalOffset == 0 means that the AppBarLayout is expanded 
     if (verticalOffset == 0) { 
      // here we check that the last item of the RecyclerView is visible 
      if (viewIsVisible(layoutManager.findViewByPosition(layoutManager.getItemCount() - 1))) { 
       layoutManager.setScrollEnabled(false); 
      } else { 
       layoutManager.setScrollEnabled(true); 
      } 
    } 
    } 
}); 

Và đây là phương pháp để kiểm tra xem xem có thể nhìn thấy:

private boolean viewIsVisible(View view) { 
    Rect scrollBounds = new Rect(); 
    list.getHitRect(scrollBounds); 
    return view != null && view.getLocalVisibleRect(scrollBounds); 
} 
Các vấn đề liên quan