В моем 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
?