gridView с разными размерами ячеек, стиль pinterest

Задний план

GridView — это класс, расширяющий AdapterView , что означает, что он эффективно отображает ячейки в виде сетки, используя старые представления. отображаться как новые, когда пользователь прокручивает их.

Проблема

Иногда вам может понадобиться специальный пользовательский интерфейс, напоминающий пользовательский интерфейс Windows Phone Tiles, в котором ячейки разных размеров расположены друг над другом.

Что-то вроде этого:

AABB
AACC
AADD
AADD

каждая буква представляет часть своей ячейки, поэтому ячейка A имеет размер 2x4, ячейки B и ячейки C занимают по 2x1 каждая, а ячейка D имеет размер 2x2.

Это может быть даже больше, когда ячейка D заканчивается немного выше того, что я показал, а прямо под ней есть еще одна ячейка, поэтому конец D и конец A не обязательно должны быть выровнены.

Примером приложения с таким стилем является pinterest .

GridView не допускает такого.

Фактически, у каждого решения, которое я пробовал, есть проблемы. Хотел бы спросить, есть ли какие-либо другие альтернативы или лучшие решения.

Что я нашел

Есть несколько способов справиться с этой проблемой:

  1. Как класс, который расширяет AdapterView GridView может иметь тип для каждого элемента (используя BaseAdapter), что позволит вам задать макет ячейки .

    Тем не менее, это по-прежнему ограничивает вас, поскольку вы будете получать ряды предметов, один под другим. вы должны их выровнять.

  2. GridLayout — относительно новый макет, это довольно гибко. Google опубликовал для него хорошую библиотеку совместимости, поддерживающую API7 и выше.

    Однако он не использует повторное использование представлений, поэтому это плохой выбор, если вы хотите показать много элементов.

    Если у вас много элементов, вам нужно будет создать для них все представления.

  3. QuiltView Library — расширяется от GridLayout, поэтому в основном у него такая же проблема.

  4. StaggeredGridView — выглядит наиболее многообещающе, но имеет много багов, особенно при смене ориентации. такие ошибки включают пустые ячейки, плохую прокрутку и NPE (редко, но все же случаются). Я также не уверен, поддерживает ли он настраиваемые ячейки вместо одних только изображений.

  5. другие решения, как указано здесь .

Вопрос

Кто-нибудь знает другой вариант решения этой проблемы? Может быть, какие-то обходные пути для любого из решений, которые я показал?


РЕДАКТИРОВАТЬ: я думаю, что в StaggeredGridView прокрутка и исключения могут быть решены с помощью обычного ImageView, размер которого вы устанавливаете внутри getView. я думаю, что причина того, что он работает странным образом, заключается в том, что образец обновляет размер изображения после его загрузки из Интернета.

Однако проблема с пустыми ячейками все еще остается в этой библиотеке. не только это, но и их размеры сильно меняются, даже без изменения ориентации.


РЕДАКТИРОВАТЬ: на данный момент я думаю, что лучшим решением является использование библиотеки PinterestLikeAdapterView. .

у него нет никаких проблем, которые я могу найти.

однако он не может заставить элементы занимать ширину более 1 ячейки. все же это очень хорошо.

РЕДАКТИРОВАТЬ: к сожалению, у него есть проблемы с notifyDataSetChanged . я сообщил об этом здесь.


person android developer    schedule 01.09.2013    source источник
comment
Я настоятельно рекомендую эту библиотеку ListView с двойной синхронизацией. Это более эффективно, чем использование GridView   -  person balysv    schedule 31.10.2013
comment
@bZea Я уже упоминал это решение (№ 5 в списке). у него много проблем. он не может использовать один адаптер для всех элементов. он не плавный (прокручивает списки один за другим) и не настраивается (не может установить количество столбцов).   -  person android developer    schedule 31.10.2013
comment
jayway.com/2014/02/17/a-multi -список-столбцов   -  person Dawid Drozd    schedule 05.03.2015


Ответы (3)


Немного поздно ответить?

проверьте эту библиотеку с etsy. выглядит очень многообещающе.

https://github.com/etsy/AndroidStaggeredGrid

Я думаю, что это более новая версия https://github.com/maurycyw/StaggeredGridView.

.

Обновлено.

Попробуйте вместо этого использовать RecyclerView StaggeredGridLayoutManager от Google.

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
person Krit    schedule 16.01.2014
comment
Я пробовал оба и судя по конфигурации по умолчанию, я думаю, что это лучше. В моем случае etsy может легко интегрироваться с chris banes pull to release. - person Krit; 24.01.2014
comment
они говорят, что ему не хватает некоторых основных вещей: StaggeredGridView не поддерживает следующее: элементы выбора элементов, событие длительного нажатия элемента, полосы прокрутки, разделители строк, эффект края, исчезающий край, прокрутка - person android developer; 24.01.2014
comment
Как насчет: developer.android.com/reference/android/support /v7/виджет/ - person goRGon; 04.12.2014

Я думаю, что RecyclerView с StaggeredGridLayoutManager может решить эту проблему, и если вы хотите также иметь быструю прокрутку, вы можете попробовать эту библиотеку.

Итак, больше никаких хитростей не требуется, так как Google предоставил решение...

person android developer    schedule 05.03.2015
comment
Тем не менее я не могу найти хороший виджет, например, я пытался реализовать StaggeredGridLayoutManager, но не могу, посмотрите на проблему, с которой я столкнулся, на это. Если вы найдете его реализацию, вы можете добавить ссылку. благодаря. - person mmlooloo; 20.03.2015

Вы можете сделать это с помощью одного ListView, где каждая ячейка содержит другой шаблон сетки. Я сделал что-то похожее на то, что вы описываете, используя эту технику. Если размеры ячеек должны быть уникальными, это не сработает, но этого должно быть достаточно для описанного вами случая:

AABB
AACC
AADD
AADD

Создав несколько шаблонов, подобных этому, с различным расположением A, B, C, D, вы можете затем случайным образом использовать их в качестве ячеек ListView, а некоторая простая математика смещения позволит вашему адаптеру заполнить каждую подячейку, чтобы выполнить что-то вроде следующего:

AABB
AACC
AADD
AADD

BBBB
ACCC
ADDD
ADDD

AAAA
BBCC
BBCC
DDDD

AABB
AACC
AADD
AADD

AABB
AACC
DDDD
DDDD
person Graham    schedule 06.11.2013
comment
то, что я показал, это просто пример. существует гораздо больше возможных способов размещения ячеек, и количество ячеек на устройстве может меняться, поскольку есть маленькие устройства и большие устройства (например, планшеты), и вы можете захотеть изменить вещи, когда устройство находится в альбомной ориентации, а не в книжной. . хотя это хорошее решение. - person android developer; 06.11.2013