Я пытаюсь работать с новым RecyclerView
, но мне не удалось найти пример RecyclerView
раздуваемых строк / карт разных типов.
С помощью ListView
я переопределяю getViewTypeCount
и getItemViewType
для обработки различных типов строк.
Должен ли я делать это "по-старому" или надо что-то делать LayoutManager
? Мне было интересно, может ли кто-нибудь указать мне правильное направление. Потому что я могу найти только примеры с одним типом.
Я хочу иметь список немного разных карточек. Или мне просто использовать scrollView
с cardViews
внутри ... сделать это без адаптера и recyclerView
?
Ответы:
Обработка логики строк / разделов, аналогичная UITableView в iOS, не так проста в Android, как в iOS, однако при использовании RecyclerView гибкость того, что вы можете делать, намного больше.
В конце концов, все дело в том, как вы определяете, какой тип представления вы показываете в адаптере. Как только вы это поймете, плавание должно быть легким (не совсем, но, по крайней мере, вы разберетесь с этим).
Адаптер предоставляет два метода, которые следует переопределить:
Реализация этого метода по умолчанию всегда будет возвращать 0, указывая на то, что существует только 1 тип представления. В вашем случае это не так, и вам нужно будет найти способ утверждать, какая строка соответствует какому типу представления. В отличие от iOS, которая управляет этим за вас с помощью строк и разделов, здесь у вас будет только один индекс, на который можно положиться, и вам нужно будет использовать свои навыки разработчика, чтобы знать, когда позиция соотносится с заголовком раздела, а когда - с нормальный ряд.
В любом случае вам нужно переопределить этот метод, но обычно люди просто игнорируют параметр viewType. В соответствии с типом представления вам нужно будет создать правильный ресурс макета и соответственно создать держатель представления. RecyclerView будет обрабатывать переработку различных типов представлений таким образом, чтобы избежать конфликтов разных типов представлений.
Если вы планируете использовать LayoutManager по умолчанию, например
LinearLayoutManager
, вам должно быть хорошо идти. Если вы планируете создать собственную реализацию LayoutManager, вам придется немного потрудиться. Единственный API, с которым вам действительно нужно работать, - это то,findViewByPosition(int position)
что дает заданное представление в определенной позиции. Поскольку вы, вероятно, захотите расположить его по-разному в зависимости от типа этого представления, у вас есть несколько вариантов:Обычно при использовании шаблона ViewHolder вы устанавливаете тег представления с держателем представления. Вы можете использовать это во время выполнения в диспетчере компоновки, чтобы узнать, к какому типу относится представление, добавив поле в держателе представления, которое выражает это.
Поскольку вам понадобится функция, которая определяет, какая позиция коррелирует с каким типом представления, вы можете каким-то образом сделать этот метод глобально доступным (может быть, одноэлементный класс, который управляет данными?), А затем вы можете просто запросить тот же метод в соответствии с Положение.
Вот пример кода:
Вот пример того, как должны выглядеть эти держатели просмотров:
Конечно, в этом примере предполагается, что вы создали свой источник данных (myData) таким образом, чтобы упростить реализацию адаптера таким образом. В качестве примера я покажу вам, как я бы сконструировал источник данных, который показывает список имен и заголовок для каждого изменения 1-й буквы имени (предположим, что список составлен по алфавиту) - аналогично тому, как контакты список будет выглядеть так:
Этот пример предназначен для решения довольно конкретной проблемы, но я надеюсь, что он дает вам хороший обзор того, как обрабатывать различные типы строк в переработчике, и позволяет вам внести необходимые изменения в свой собственный код в соответствии с вашими потребностями.
источник
names[i].substring(0, 1)
onCreateViewHolder
который поможет нам создать держатель представления. Для получения более подробной информации вы можете проверить мою долю: stackoverflow.com/questions/47245398/…Уловка состоит в том, чтобы создать подклассы ViewHolder и затем привести их.
А затем во время выполнения сделайте что-то вроде этого:
Надеюсь, поможет.
источник
Согласно отличному ответу Гила, я решил, переопределив getItemViewType, как объяснил Гил. Его ответ великолепен и должен быть отмечен как правильный. В любом случае добавляю код, чтобы набрать очки:
В вашем адаптере ресайклера:
Таким образом вы можете установить любой пользовательский макет для любой строки!
источник
Это довольно сложно, но так сложно, просто скопируйте приведенный ниже код, и все готово.
наслаждаться !!!!
источник
Мы можем добиться множественного просмотра одного RecyclerView следующим образом: -
Зависимости от Gradle, поэтому добавьте ниже код: -
RecyclerView в XML
Код деятельности
Первый XML
Второй XML
Третий XML
Теперь пора сделать адаптер, и он является основным для отображения другого представления -2 в одном и том же представлении ресайклера, поэтому, пожалуйста, полностью проверьте этот код: -
Вы также можете проверить эту ссылку для получения дополнительной информации.
источник
Вы должны реализовать
getItemViewType()
метод вRecyclerView.Adapter
. По умолчанию возвращаетсяonCreateViewHolder(ViewGroup parent, int viewType)
реализацияviewType
этого метода0
. Во-первых, вам нужен тип представления элемента в позиции для целей повторного использования представления, и для этого вам нужно переопределитьgetItemViewType()
метод, в котором вы можете передать,viewType
который вернет вашу позицию элемента. Пример кода приведен нижеисточник
getItemViewType (int position) - это ключ
Как это сделать ?
Вы можете создать объект
RecyclerView
с любым количеством различных представлений (ViewHolders). Но для лучшей читаемости возьмем примерRecyclerView
с двумяViewholders
.Запомните эти 3 простых шага, и все будет в порядке.
getItemViewType(int position)
ViewType
метода onCreateViewHolder ()Заполнить представление на основе
onBindViewHolder()
метода itemViewType inВот вам фрагмент кода
Код GitHub:
Вот проект, в котором я реализовал RecyclerView с несколькими ViewHolders.
источник
Вы можете просто вернуть ItemViewType и использовать его. См. Код ниже:
источник
Вы можете использовать библиотеку: https://github.com/vivchar/RendererRecyclerViewAdapter
Для каждого элемента вы должны реализовать ViewRenderer, ViewHolder, SomeModel:
ViewHolder - это простой держатель представления ресайклера.
SomeModel - это ваша модель с
ItemModel
интерфейсомБолее подробную информацию вы можете найти в документации.
источник
Вы можете использовать эту библиотеку:
https://github.com/kmfish/MultiTypeListViewAdapter (написано мной)
Адаптер настройки:
Для каждой позиции:
источник