В моем Android-приложении, работающем на Android 5.1.1, у меня есть макет с использованием Toolbar с TabLayout, а внизу - ViewPager. Все они объединены в CoordinatorLayout.
На первой странице ViewPager есть RecyclerView обслуживающий CardView элемент.
Моя проблема в том, что мой ViewPager продолжает изменяться таким образом, чтобы мои элементы списка CardView обрезались.
Моя основная компоновка выглядит в основном так:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent" >
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.design.widget.CoordinatorLayout>
И первый фрагмент, который обслуживает мой ViewPager, выглядит так:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"/>
</FrameLayout>
Это делает что-то похожее на это:
При нажатии кнопки в моем макете я использую startActivityForResult для вызова другого действия, а иногда при возврате к моей работе мой список обрезается так, что видится только половина первого элемента:
После поворота по горизонтали на другой пейджер в ViewPager, а затем обратно проблема исчезнет, поэтому кажется, что повторная компоновка не была правильно запущена. Нажатие HOME и возобновление моей активности НЕ разрешают проблему. Обратите внимание, что это происходит, даже если я не изменяю свой макет каким-либо образом, я просто возвращаюсь из вызова startActivityForResult. И да, это случается иногда... И у меня нет фоновых потоков, которые могли бы объяснить кажущееся случайное поведение.
Сначала я подумал, что это уменьшилось RecyclerView, но с помощью HierarchyViewer я смог найти, что на самом деле весь ViewPager уменьшился примерно до половины его первоначальной высоты.
Я попробовал разные хаки, чтобы обойти это, включая вызов invalidate() и requestLayout() на весь мой просмотр hiearchy, но ничего не помогло (хотя прокрутка на другую страницу и обратно исправлена). Кроме того, это не те решения, к которым я хочу прибегнуть... Затем я попытался изменить высоту ViewPager на wrap_content, что фактически решило эту конкретную проблему; после возвращения в мою работу первый элемент в моем RecyclerView никогда не обрезается, и я могу прокручивать вниз до других элементов. Однако теперь вместо этого последний элемент моего списка всегда обрезается, как видно на этом скриншоте, где список прокручивается до конца:
Поскольку я сейчас нахожусь в точке, где я действительно не понимаю, что происходит, мне нужна помощь. Что я должен использовать как layout_height для моего ViewPager и, прежде всего, почему? Для меня match_parent имеет смысл, но как я должен здесь думать? Есть ли разумная причина, которую мои взгляды обрезали при использовании match_parent, или я действительно столкнулся с ошибкой в ViewPager, RecyclerView и/или CoordinatorLayout? Как я могу убедиться, что мой ViewPager последовательно заполняет всю область экрана под AppBar и что мой RecyclerView можно прокручивать по вертикали для правильного отображения всех элементов списка CardView?


