Android динамически рассчитывает количество столбцов - PullRequest
0 голосов
/ 09 декабря 2011

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

Насколько я знаю, нет стандартного представления Android с адаптером, который делает это. С GridView вы можете иметь несколько столбцов, но не несколько строк один столбец, а другие два. TableLayout может растягивать представления, но и здесь вы должны знать, сколько столбцов вам нужно на строку. Кроме того, у него нет адаптера.

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

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

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

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

Если вы, например, используете Cursor с xстрок для передачи данных адаптеру, тогда общее число элементов, как видно из Adapter, также равно x.Однако, поскольку вы условно отображаете два элемента в одну и ту же строку, это означает, что ListView увидит y строк в Adapter, где y <= x.Но вы не можете легко сказать с самого начала, что будет y.Кроме того, если ListView запрашивает Adapter для элемента i, где 0 <= i <y, у <code>Adapter не будет (простого) способа определить, какие элементы из Cursor будут imap to.

При этом жизнеспособным решением было бы создать подкласс AdapterView или ListView и самостоятельно реализовать расположение элементов.Когда вы получаете каждый элемент из Adapter, вы будете измерять и размещать его в зависимости от размеров окружающих элементов адаптера.

Другое решение, которое может работать для вас, если вы этого не сделаетеиметь большое количество элементов - это использовать два пользовательских Adapter s, один из которых называется ItemAdapter, а другой - RowAdapter.ItemAdapter будет раздувать фактические предметы на основе (предполагаемого) Cursor.RowAdapter будет использовать ItemAdapter, чтобы получить предметы и объединить их в ряды.ListView в свою очередь будет использовать RowAdapter.Проблема в том, что для того, чтобы узнать, сколько строк будет выдано RowAdapter, необходимо измерить все элементы от ItemAdapter до того, как RowAdapter будет подключен к ListView.

0 голосов
/ 09 декабря 2011

Насколько я знаю, нет готового решения вашей проблемы.Я еще не пробовал что-то подобное, но я бы использовал LinearLayout в качестве элемента списка.Затем просто создайте свой собственный Deflater (например, CursorAdapter), который дефлирует макет и проверяет длину.При необходимости вы сможете добавить новый вид (например, TextView) в LinearLayout.

...