Задний план
GridView — это класс, расширяющий AdapterView , что означает, что он эффективно отображает ячейки в виде сетки, используя старые представления. отображаться как новые, когда пользователь прокручивает их.
Проблема
Иногда вам может понадобиться специальный пользовательский интерфейс, напоминающий пользовательский интерфейс Windows Phone Tiles, в котором ячейки разных размеров расположены друг над другом.
Что-то вроде этого:
AABB
AACC
AADD
AADD
каждая буква представляет часть своей ячейки, поэтому ячейка A имеет размер 2x4, ячейки B и ячейки C занимают по 2x1 каждая, а ячейка D имеет размер 2x2.
Это может быть даже больше, когда ячейка D заканчивается немного выше того, что я показал, а прямо под ней есть еще одна ячейка, поэтому конец D и конец A не обязательно должны быть выровнены.
Примером приложения с таким стилем является pinterest .
GridView не допускает такого.
Фактически, у каждого решения, которое я пробовал, есть проблемы. Хотел бы спросить, есть ли какие-либо другие альтернативы или лучшие решения.
Что я нашел
Есть несколько способов справиться с этой проблемой:
Как класс, который расширяет AdapterView GridView может иметь тип для каждого элемента (используя BaseAdapter), что позволит вам задать макет ячейки .
Тем не менее, это по-прежнему ограничивает вас, поскольку вы будете получать ряды предметов, один под другим. вы должны их выровнять.
GridLayout — относительно новый макет, это довольно гибко. Google опубликовал для него хорошую библиотеку совместимости, поддерживающую API7 и выше.
Однако он не использует повторное использование представлений, поэтому это плохой выбор, если вы хотите показать много элементов.
Если у вас много элементов, вам нужно будет создать для них все представления.
QuiltView Library — расширяется от GridLayout, поэтому в основном у него такая же проблема.
StaggeredGridView — выглядит наиболее многообещающе, но имеет много багов, особенно при смене ориентации. такие ошибки включают пустые ячейки, плохую прокрутку и NPE (редко, но все же случаются). Я также не уверен, поддерживает ли он настраиваемые ячейки вместо одних только изображений.
другие решения, как указано здесь а> .
Вопрос
Кто-нибудь знает другой вариант решения этой проблемы? Может быть, какие-то обходные пути для любого из решений, которые я показал?
РЕДАКТИРОВАТЬ: я думаю, что в StaggeredGridView прокрутка и исключения могут быть решены с помощью обычного ImageView, размер которого вы устанавливаете внутри getView. я думаю, что причина того, что он работает странным образом, заключается в том, что образец обновляет размер изображения после его загрузки из Интернета.
Однако проблема с пустыми ячейками все еще остается в этой библиотеке. не только это, но и их размеры сильно меняются, даже без изменения ориентации.
РЕДАКТИРОВАТЬ: на данный момент я думаю, что лучшим решением является использование библиотеки PinterestLikeAdapterView. .
у него нет никаких проблем, которые я могу найти.
однако он не может заставить элементы занимать ширину более 1 ячейки. все же это очень хорошо.
РЕДАКТИРОВАТЬ: к сожалению, у него есть проблемы с notifyDataSetChanged . я сообщил об этом здесь.