Как отобразить 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);

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

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

1 | Человек 1

2 | Человек 2

3 | Человек 3

4 | Человек 4

Есть идеи?


person Sosi    schedule 12.03.2010    source источник
comment
Было бы здорово, если бы вы могли разместить фотографию, показывающую, что вы хотите сделать...   -  person Janusz    schedule 12.03.2010
comment
jayway.com/2014/02/17/a-multi -список-столбцов   -  person Dawid Drozd    schedule 05.03.2015


Ответы (5)


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

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

Метод в моем классе 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.

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

person Steven F. Le Brun    schedule 13.03.2010
comment
Кто-нибудь может объяснить mAuthor, членов mCopyright? Могут ли они быть массивами? Как пишется его строка1\nline2\nline3 ??? И это не строки в курсоре — это столбцы списка, верно? - person ; 21.10.2010
comment
Могу ли я использовать название на этих cloumns? - person Mashhadi; 29.06.2011
comment
+1 за часть исключения столбца _id, это действительно вызвало у меня головную боль, пока я не прочитал эту заметку :) - person Mohamed_AbdAllah; 18.01.2012

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

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

person JRL    schedule 12.03.2010
comment
Просто к вашему сведению, ссылка мертва - person Sealer_05; 23.07.2016
comment
@Sealer_05 Теперь он перенаправляет на общий учебник RecyclerVIew. Наверное, даже более запутанно, чем если бы они позволили мертвым упокоиться с миром. - person Abandoned Cart; 13.05.2019

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

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

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

person stfn    schedule 12.03.2010

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

person Parallel Universe    schedule 07.07.2012

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

person Shoeb Ahmed Siddique    schedule 20.09.2014