Как отобразить два столбца ListView в Android? - PullRequest
16 голосов
/ 12 марта 2010

У меня есть приложение для Android, которое показывает сетку, которая показывает:

1

2

3

4

GridView gridview=(GridView)findViewById(R.id.GridView_test);
DataBaseHelper dbhelper=new DataBaseHelper(this);
ArrayList<String> test=new ArrayList<String>(5);
backlinksadapter.add("1");
backlinksadapter.add("2");
backlinksadapter.add("3");
backlinksadapter.add("4");
ArrayAdapter mAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, test);
gridview.setAdapter(mAdapter);

На данный момент работает, но я хотел бы показать строку foreach сетки, 2 столбца со значениями двумерного массива (что-то вроде GridView в ASP.Net - как источник данных -).

Я бы хотел показать:

1 | Человек 1

2 | Человек 2

3 | Человек 3

4 | Человек 4

Есть идеи?

Ответы [ 5 ]

31 голосов
/ 13 марта 2010

Должен ли это быть вид сетки? Будет ли ListView работать?

Я написал ListView и ListActivity, которые отображают два элемента в каждой строке. Я начал с SDK, предоставленного макетом simple_list_item_2.xml, в котором перечисляются два элемента в строке, но размещается один поверх другого (две строки), а вторая - меньшим шрифтом. Я хотел, чтобы оба элемента были в одной строке: один справа и один слева.

Сначала я скопировал simple_list_item_2.xml в каталог res / layout моего проекта под новым именем и изменил свойство android: mode = "twoLine" на "oneLine", сохранив при этом имя элемента представления как "TwoLineListItem". Затем я заменил два внутренних элемента на те, которые делали то, что я хотел.

В коде для инициализации списка я создал MatrixCursor и заполнил его требуемыми данными. Для поддержки двух элементов каждая строка в MatrixCursor требует трех столбцов, один из которых является первичным ключом «_id», а два других столбца - это элементы, которые я хотел отобразить. Затем я смог использовать SimpleCursorAdapter для заполнения и управления ListView.

Файл XML моего макета:

 <?xml version="1.0" encoding="utf-8"?>
  <TwoLineListItem
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="2dip"
     android:paddingBottom="2dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:mode="oneLine"
  >
<TextView
    android:id="@android:id/text1"
    android:gravity="left"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="6dip"
    android:layout_marginTop="6dip"
    android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
    android:id="@android:id/text2"
    android:gravity="right"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="6dip"
    android:layout_marginTop="6dip"
    android:layout_marginRight="6dip"
    android:layout_toRightOf="@android:id/text1"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@color/MainFontColor"
/>
</TwoLineListItem>

Обратите внимание, что я использовал «левый» и «правый» андроид: значения силы тяжести, чтобы сделать левый элемент левым, а правый - правым. Вам понадобятся разные значения гравитации для вашего макета, плюс вам понадобятся свойства для управления размером левого бокового элемента, который мне не нужен.

Метод в моем классе ListActivity, который инициализировал ListView:

private void initListView()
{
    final String   AuthorName    = "Author: ";
    final String   CopyrightName = "CopyRight: ";
    final String   PriceName     = "Price: ";

    final String[] matrix  = { "_id", "name", "value" };
    final String[] columns = { "name", "value" };
    final int[]    layouts = { android.R.id.text1, android.R.id.text2 };

    MatrixCursor  cursor = new MatrixCursor(matrix);

    DecimalFormat formatter = new DecimalFormat("##,##0.00");

    cursor.addRow(new Object[] { key++, AuthorName, mAuthor });
    cursor.addRow(new Object[] { key++, CopyrightName, mCopyright });
    cursor.addRow(new Object[] { key++, PriceName,
            "$" + formatter.format(mPrice) });

    SimpleCursorAdapter data =
        new SimpleCursorAdapter(this,
                R.layout.viewlist_two_items,
                cursor,
                columns,
                layouts);

    setListAdapter( data );

}   // end of initListView()

Параметр конструктора MatrixCursor представляет собой массив строк, которые определяют порядок и имена столбцов в курсоре. Важное замечание: Обязательно добавьте столбец «_id», без него MatrixColumn вызовет исключение и не сможет работать!

Три переменные, mAuthor, mCopyright и mPrice, являются тремя элементами данных в моем классе ListAdaptor, и они инициализируются в другом месте. В моем реальном коде mAuthor фактически построен в этом методе из списка имен авторов. Имена авторов объединяются в одну строку, используя "\ n" в качестве разделителей между именами. Это приводит к тому, что имена нескольких авторов появляются в разных строках одного и того же TextView.

Параметры ctor SimpleCursorAdapter - это идентификатор представления, используемого для каждой строки списка, курсор, содержащий данные, массив строк, где каждый элемент - это имя столбца из курсора (в порядке их получения) и соответствующий массив идентификаторов View для View, который будет использоваться для каждого элемента в строке List.

4 голосов
/ 12 марта 2010

Если вы не можете найти существующий адаптер с такими свойствами, вы можете создать свой собственный адаптер и сопоставить его с вашим представлением.

В учебнике Hello, GridView показано, как это сделать.

3 голосов
/ 12 марта 2010

JRL прав, вы должны написать свой собственный адаптер, который позволит вам контролировать то, что будет отображаться в каждой строке. Вы можете найти это полезным. Более сложный пример можно найти здесь http://developerlife.com/tutorials/?p=327.

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

Лучший успех.

0 голосов
/ 20 сентября 2014

Вы можете просто добавить это в свой XML андроид: = numColumns "2"

0 голосов
/ 08 июля 2012

Почему бы не создать класс, чей toString() возвращает str(id) + " | " + personName, и использовать его в качестве класса шаблона вместо String объекта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...