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