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