Можно ли использовать один RecyclerView для нескольких списков?
Здравствуйте!
Разрабатываю приложение, в приложении будет пять разных списков. Как то не очень охота пилит под каждый список отдельный активити, фрагмент, RecyclerView. Введь они отличаются только адаптерами и разметкой для item-ов. Отсюда и возникла потребность запилить один экран(активити, фрагмент, RecyclerView) для списков, просто в него подставлять различные списки. Подскажите пожалуйста, как это можно реализовать? Можно ли вообще так делать? Может есть какие библиотеки которые упростят такую работу.
Ну вообще да, для этого существует адаптер. Просто нужна логика, которая будет подсовывать нужный адаптер, и всё. Никакие дополнительные библиотеки не нужны для этого.
Кроме того, прошло то время, когда одна активити == один экран. Стоит пилить отдельные экраны на фрагментах.
Ну и стоит заранее подумать о том, что экраны в будущем могут различаться не только списками, и учесть это при разработке.
Если коротко, то в своем адаптере нам надо перекрыть метод getItemViewType(), в котором нам надо будет определять тип текущего элемента (через instanceof например). Далее в методе onCreateViewHolder() нам на вход будет приходить наш viewType и мы сможем понять, какой ViewHolder использовать.
geron по ситуации :) на данный момент у вас 5 разных списков (может быть даже не простых, а с какой-нибудь логикой в адаптере), а вдруг потом их будет 6, 7 или 10? Тогда адаптер превратится в винегрет. Лично я подход с ViewType использую когда количество разных сущностей, с которыми должен уметь работать адаптер, не больше 3 и их хоть как-то можно логически объединить.
Денис Загаевский: То есть, Ваш вариант используем тогда, когда у нас есть разные списки, которые надо показать на разных экранах(экран на самом деле один), а адаптер каждый под свой список. Вариант Андрея когда нужно разные списки запихать в один экран с разными айтемами?
geron: Примерно да. Часто встречаются ситуации, когда в одном списке (ленте) несколько разных айтемов, они могут идти вперемежку. Вот тогда используется вариант Андрея. Кстати, в этом случае ещё удобно использовать дополнительную библиотеку;) AdapterDelegates.