RecyclerView 1.2.0-alpha02: установка для общего ресурса RecycledViewPool значения RV делает MergeAdapter cra sh и просмотр типов на других экранах несовместимыми - PullRequest
0 голосов
/ 08 апреля 2020

Я использую общий RecycledViewPool между некоторыми фрагментами. Я решил попробовать MergeAdapter в одном фрагменте. Для этого экрана я создал отдельный адаптер для каждого viewType и переопределил метод getItemViewType для возврата идентификатора макета в качестве типа представления.

Когда я go на любом другом экране, который имеет общий доступ к RecycledViewPool, но не использует MergeAdapter Я вижу некоторые из viewHolders с предыдущего экрана. Когда я возвращаюсь назад, происходит сбой приложения, и в логах я вижу ClassCastException, говорящий, что ViewHolder1 нельзя преобразовать в ViewHolder2.

Мой код выглядит следующим образом:

recyclerView.setRecycledViewPool(sharedViewPool)

val adapter = MergeAdapter(adapter1, adapter2, adapter3, adapter4)
recyclerView.adapter = adapter

Как сохранить общий RecycledViewPool, но исключить ClassCastException и прекратить показывать ViewHolders на других экранах, где они не должны отображаться?

1 Ответ

0 голосов
/ 08 апреля 2020

После более подробного изучения документации я обнаружил, что проблема была MergeAdapter с конфигурацией по умолчанию.

из документации :

По умолчанию MergeAdapter изолирует типы представлений вложенных адаптеров друг от друга, так что он изменит тип представления перед тем, как сообщить о нем в RecyclerView, чтобы избежать любых конфликтов между типами представления добавленных адаптеров. Это также означает, что каждый добавленный адаптер будет иметь свой собственный изолированный пул RecyclerView.ViewHolders без повторного использования между добавленными адаптерами.

Если ваши RecyclerView.Adapters совместно используют одни и те же типы представлений и могут поддерживать совместное использование RecyclerView. ViewHolder между добавленными адаптерами предоставляет экземпляр MergeAdapter.Config, в котором для MergeAdapter.Config.isolateViewTypes установлено значение false. Обычный шаблон использования для этого - вернуть R.layout. из метода RecyclerView.Adapter.getItemViewType (int).

Я также читал это в статье , написанной Флориной Мунтенеску, и по некоторым причинам я думал, что isolateViewTypes влияет только адаптеры добавлены к одному MergeAdapter. Но так как в конфигурации по умолчанию он будет изменять возвращаемые типы представлений для каждого ViewHolder, это может (скорее всего) привести к несогласованности в общем RecycledViewPool. Не уверен, что это ошибка или ожидаемое поведение. Было бы здорово услышать что-нибудь от команды, работающей над RecyclerView.

Решением было установить isolateViewTypes в false.

val adapter = MergeAdapter(
    MergeAdapter.Config.Builder().setIsolateViewTypes(false).build(),
    adapter1, 
    adapter2, 
    adapter3, 
    adapter4
)

Я думаю, что это довольно легко сделать ошибку и Я надеюсь, что это решение сэкономит время для других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...