7

Я использую следующий макет в своем проекте. Он работает отлично, но CollapsingToolbarLayout рушится, даже если RecyclerView пуст или RecyclerView имеет очень мало элементов. Поведение, которое я хочу, CollapsingToolbarLayout должно разрушаться только тогда, когда RecyclerView имеет элементы, превышающие видимые элементы. Как я могу достичь такого поведения?CollapsingToolbarLayout не должен разрушаться, когда RecyclerView пуст

<?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

Привет Vivart, Me облицовки таких же вопрос. Если у вас возникла проблема, поделитесь своей идеей. Спасибо –

+0

Я также реализовал то же самое, но, к сожалению, моя рушится barlayout не рушится. Когда-либо. посмотрите на мой вопрос - http://stackoverflow.com/questions/33093066/collapsing-bar-layout-and-recyclerview –

ответ

-2

Попробуйте изменить collapsingBarLayout XML для:

<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"> 

я добавил 2 дополнительные флаги: enterAlways и enterAlwaysCollapsed. Это не 100% -ное рабочее решение, но лучше, чем поведение, которое вы в настоящее время имеете.

0

Его известная ошибка. Обновите свои библиотеки поддержки до 22..2.1:

com.android.support:design:22.2.1 
+3

Проблема все еще присутствует в версии 23.1.0. – Longi

+0

У кого-то есть ссылка на ошибку? – Eefret

+3

Все еще есть эта ошибка ... с 23.1.1 – Blunderer

0

Если это все еще актуально, я думаю, что мне удалось добиться желаемого поведения.

Прежде всего, чтобы включить/отключить скроллинг, мы должны реализовать пользовательский LinearLayoutManager (благодаря 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(); 
    } 
} 

и установите его на RecyclerView:

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

Тогда мы необходимо определить, когда включать и отключать прокрутку. Я сделал это с 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); 
      } 
    } 
    } 
}); 

А вот метод, чтобы проверить, если вид виден:

private boolean viewIsVisible(View view) { 
    Rect scrollBounds = new Rect(); 
    list.getHitRect(scrollBounds); 
    return view != null && view.getLocalVisibleRect(scrollBounds); 
} 
Смежные вопросы