Как отобразить два столбца ListView в Android?

У меня есть приложение для 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 столбца со значениями 2-мерного массива (что-то вроде GridView в ASP.Net - в качестве источника данных).

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

1 | Человек 1

2 | Человек 2

3 | Лицо 3

4 | Человек 4

Любая идея?

Ответы

Ответ 1

Должен ли быть вид сетки? Будет ли работать 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.

My Layout XML File:

 <?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 - это идентификатор представления, который будет использоваться для каждой строки списка, курсора, содержащего данные, массива строк, где каждый элемент является именем столбца из курсора (в порядке их получения) и соответствующий массив идентификаторов вида для представления, который будет использоваться для каждого элемента в строке списка.

Ответ 2

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

Привет, GridView в руководстве показано, как это сделать.

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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