Intereting Posts
Выбор устройства Android Studio показывается до завершения Gradle Build Android: как я могу напечатать переменную на консоли eclipse «Недостаточно места для хранения», даже в памяти устройства много свободного места Как определить, какое Bluetooth-устройство вызывает ACTION_ACL_CONNECTED? Android DrawerLayout не показывает значок правильного индикатора Должен ли я удалить e.printStackTrace () из моего кода перед публикацией Когда вызывается вызов ServiceConnection.onServiceDisconnected ()? Неподдерживаемая операция: Android, дооснащение, OkHttp. Добавление перехватчика в OkHttpClient Как отключить кеш браузера Android навсегда? Почему использование статических вспомогательных методов в Java плохое? Формирование звука через динамик в Android Проверьте правильность службы Google Play: «К сожалению приложение перестало работать» Можно перейти прямо ко второму виду в ViewAnimator RegisterMediaButtonEventReceiver / кнопки объемного объема Последовательный порт Android через аудиоразъем

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

Задний план

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

Проблема

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

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

AABB AACC AADD AADD 

Каждая буква представляет собой часть его ячейки, поэтому ячейка A равна 2×4, ячейка B и ячейка C принимают по 2х каждый, а ячейка D – 2×2.

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

Примером приложения, имеющего этот стиль, является pinterest .

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

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

Что я нашел

Существует несколько способов решения этой проблемы:

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

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

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

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

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

  3. Библиотека QuiltView – выходит из GridLayout, поэтому в основном имеет такую ​​же проблему, как и она.

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

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

Вопрос

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


EDIT: Я думаю, что о StaggeredGridView, прокрутка и исключения могут быть решены с помощью обычного ImageView, который вы задали его размер внутри getView. Я думаю, что причина для его работы странным образом заключается в том, что образец обновляет размер изображения после его загрузки из Интернета.

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


EDIT: на данный момент я считаю, что лучшим решением является использование библиотеки PinterestLikeAdapterView .

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

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

EDIT: к сожалению, у него есть проблемы с notifyDataSetChanged. Я сообщил об этом здесь .

Solutions Collecting From Web of "GridView с различными размерами ячеек, стиль pinterest"

Слишком поздно ответить?

Проверьте эту библиотеку от 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); 

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

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

Вы можете выполнить это с помощью единого 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