Как сохранить положение скроллинга RecycleView при переключении фрагментов?
Добрый день!
Задача такая - есть несколько фрагментов, в каждом RecycleView.
Нужно чтобы при переключении фрагментов в каждом фрагменте сохранялась позиция скроллинга списка, чтобы не с начала.
Как это правильнее архитектурно реализовать, т.е. либо все фрагменты одновременно хранить в разных контейнерах, либо как то их состояние и затем replace в один контейнер ... В общем, не совсем понятно..
Фрагменты переключаются через BottomNavigationView.
У LayoutManager'a есть методы onSaveInstanceState/onRestoreInstanceState , их надо вызывать в соответствующих методах активити/фрагмента. Как это архитектурно реализовать вообще не принципиально.
У меня четыре фрагмента с RecycleView должны работать с BottomNavigationView,
другие фрагменты без BottomNavigationView через DrawerLayout,
и еще третьи фрагменты должны добавляться в стек поверх фрагментов из BottomNavigationView.
Как эту кашу разрулить не совсем понимаю, т.к. позиции скроллинга RecycleView должны сохранятся и восстанавливаться, обновление только через Swipe.
Я даже не представляю какой шаблон layout должен быть для хранения этого всего, все попытки приводят к костылям..
Валерий В., В смысыле? В каждом фрагменте же свой ресайклер, так? У фрагмента есть методы сохранения/восстановления состояния. В них и сохраняй/восстанавливай. Bottom там навигация или что - вообще по барабану, фрагмент вещь в себе, и про окружающий мир должен быть вообще не должен знать.
Денис Загаевский, да, в каждом фрагменте свой RV и свой адаптер.
Мне не хватает опыта по андроид-кодингу, поэтому не с чем особо сравнивать, какие best practices лучше использовать. Не хватает широты взгляда, так сказать.
Т.е. вы предлагаете все различные виды фрагментов пихать в один FrameLayout в MainActivity? А как тогда управлять Toolbar, BottomNavigationView , DrawerLayout - они где должны быть, а где то нет?
И опять же, как получить и установить позицию скроллинга в RecycleView, ведь штатных методов у него нет? Мне предлагают использовать это:
Сохраняете в onPause(), восстанавливаете в onResume()
Сохранение
lastFirstVisiblePosition = ((LinearLayoutManager)recyclerView
.getLayoutManager())
.findFirstCompletelyVisibleItemPosition();
Восстановление
Но опять же, это не позиция скроллинга, а позиция первого полностью видимого элемента...
А если делать каждый RecycleView в своем FrameLayout и просто переключать их видимость через View.GONE/VISIBLE ? Тут фрагменты будут жить пока живет активность и ничего сохранять не надо...
Валерий В., о_О'
Я вижу, что опыта действительно не хватает, прям даже не знаю, что сказать. Брать и управлять. А что? Я вообще не вижу связи между вопросом и тем, куда пихать фрагменты.
Денис Загаевский, ну, для примера, приложение для Вконтакте. Я не могу поверить, что там все в одном контейнере, там их столько много разных layout'ов ...
Денис Загаевский, ну тогда, pls, ответьте еще на несколько вопросов.
Это нормально, когда 30 фрагментов в одном FrameLayout replace'яться в MainActivity? И где хранить все состояния каждого из 30 фрагментов - в той же MainActivity? А также состояния остальных элементов - навигации и др. - тоже в MainActivity? Это ж MainActivity разбухнет неимоверно...
Я правильно рассуждаю?
Валерий В., да это нормально. Если только все они разом не лежат в бэкстеке - это уже что-то странное с навигацией.
Реплейсить их можно в активити условно - выделить отдельную сущность, Router, который рулит навигацией.
Про сохранение состояния ui. Eсли посмотреть onSaveInstanceState фрагмента, туда приходит Bundle, куда и надо сохранять состояние (IcePick в помощь). Каждый фрагмент сохраняет состояние своей вьюхи и ничего не знает про всё остальное. Активити и роутер ничего не знают про ui фрагментов.
Кто, где и для чего разбухает при таком раскладе - я не знаю.