Как разговаривать с адаптером, не привлекая внимания санитаров
💡 Представим, что вы хотите с помощью RecyclerView отобразить список, в котором будет несколько разных способов отображения элементов: в одном будет чекбокс, в другом картинка, в третьем картинка и текст, в остальных ещё что-то другое. Как это сделать ❓
Адаптеру надо как-то объяснить, сколько типов отображения у вас есть, и чем они отличаются.
1️⃣ Начинаем мы ему объяснять с переопределения метода getItemViewType, который вызывается автоматически в начале отрисовки каждого элемента списка. В этом методе есть аргумент position, и именно здесь вы решаете, какой тип отображения будет на каждой position списка. Метод возвращает целое число, по которому мы и будем дальше определять тип отображения.
2️⃣ Потом адаптер вызовет метод onCreateViewHolder, у которого есть целочисленный аргумент viewType — тот самый, логику для вычисления которого мы переопределили в предыдущем методе. А из этого метода вы на основании полученного viewType должны вернуть соответствующий этому типу отображения ViewHolder — то есть объяснить адаптеру, какие вьюхи вам для каждого типа отображения понадобятся.
3️⃣ Теперь настанет очередь onBindViewHolder, в котором аргументом будет являться уже вьюхолдер и position. Вы должны определить, какой это из ваших вьюхолдеров (здравствуй, полиморфизм), взять из него соответствующие вьюхи и наполнить их информацией из элемента на этой position.
🎬 Дело сделано! Мы определили для конкретной position конкретный viewType, сопоставили с вьюхолдером и наполнили его вьюхи. И так адаптер пройдётся по всем элементам и отобразит их так, как мы ему сказали.
🤌🏼 Под каждый viewType обычно заводят свою константу с понятным названием в адаптере, чтоб потом не путаться в числах.
P.S.: хотите видео-разбор типичных ошибок при организации списков? 10 реакций этому посту и снимаю 😉
Post #125
760
- 👍 16
- 🔥 4
- 👏 1