它必须是网格视图吗?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>
请注意,我使用“左”和“右”android:重力值使左侧项目左对齐,右侧项目右对齐。您的布局将需要不同的重力值,并且需要属性来控制我不需要的左侧项目的大小。
我的 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 参数是要用于每个 List 行的 View 的 ID、包含数据的游标、字符串数组(其中每个元素是游标中列的名称(按获取顺序),以及视图用于 List 行中每个项的相应视图 ID 数组。