CollapsingToolbarLayout приводит к тому, что нижняя часть RecyclerView находится под экраном - PullRequest
2 голосов
/ 14 июля 2020

У меня есть AppBarLayout с фиксированной высотой (@ dimen / app_bar_height = 200dp), в котором есть CollapsingToolbarLayout. При прокрутке вниз часть recyclerview скрывается под нижней частью экрана.

Если я убираю флаги прокрутки (ie. Отключить сворачивание прокрутки), я удаляю app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" из CollapsingToolbarLayout, тогда он обычно выравнивает нижнюю часть экрана.

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:ignore="MergeRootFrame">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <!-- Problem HERE in app:layout_scrollFlags -->
        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:expandedTitleGravity="bottom"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" 
            app:toolbarId="@+id/toolbar">

            <TextView
                android:text="Hello, Hello, Hello, Hello, Hello, Hello, Hello, Hello, Hello, Hello"
                android:textSize="19sp"
                android:textStyle="bold"
                android:id="@+id/txtDescr"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.5"/>

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/detail_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

            <com.google.android.material.floatingactionbutton.FloatingActionButton
                android:id="@+id/fab"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|start"
                android:layout_margin="@dimen/fab_margin"
                app:layout_collapseMode="pin"
                app:srcCompat="@android:drawable/stat_notify_chat" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:scrollbars="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:scrollbarThumbVertical="@android:color/darker_gray"
        android:scrollbarSize="7dp"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Ответы [ 4 ]

2 голосов
/ 14 июля 2020

Пробовал ваш код несколько раз, но безуспешно. Наконец-то нашел обходной путь. Просто добавьте высоту представления, которую вы хотите закрепить вверху как margin-bottom, к recyclerView, сохраняя высоту recyclerView как wrap_content.

Например. Если вы хотите закрепить свою панель инструментов, добавьте ее высоту в качестве нижнего поля к представлению ресайклера

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:scrollbars="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:scrollbarThumbVertical="@android:color/darker_gray"
        android:scrollbarSize="7dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="?attr/actionBarSize"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

Надеюсь, это решит вашу проблему.

1 голос
/ 29 июля 2020

Я предполагаю, что вы загружаете элементы в RecyclerView слишком рано, до того как CoordinatorLayout завершит измерение AppbarLayout. Это может произойти, если у вас есть список элементов, сразу доступный в вашем onViewCreated, и вы сразу же создаете и назначаете свой адаптер. Я не знаю, как вы настраиваете RecyclerView в своем коде, но у меня была такая же проблема, и я решил ее, используя View.post(Runnable):

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val adapter = MyAdapter(viewModel.items)
    // replace:
    // recyclerView.adapter = adapter
    // with:
    view.post { recyclerView.adapter = adapter }
}

Также обратите внимание, что если вы использовали подкласс ListAdapter , который работает асинхронно из основного потока, на самом деле, у вас, вероятно, не было бы этой проблемы.

1 голос
/ 17 июля 2020

В итоге я использовал следующее, чтобы обнаружить прокрутку последнего элемента и notifyDataSetChanged (), что решает проблему:

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        private boolean hasFixedLastItemNotVisible = false;

        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);

            if (!hasFixedLastItemNotVisible &&
                    !recyclerView.canScrollVertically(10) &&
                    newState==RecyclerView.SCROLL_STATE_IDLE) {
                hasFixedLastItemNotVisible = true;
                recyclerView.getAdapter().notifyDataSetChanged();
            }
        }
    });
0 голосов
/ 17 июля 2020

при прокрутке вниз recycleview .... если вам не нужна панель инструментов, так как recycleview скрывается за панелью инструментов ....

используйте это -> app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"

, чтобы ваш Код collapsingtoolbarlayout будет ->

 <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="350dp"
        app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleTextAppearance="@android:color/transparent"
        android:fitsSystemWindows="true"
        >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...