如何在 Android 中显示两列 ListView?
Posted
技术标签:
【中文标题】如何在 Android 中显示两列 ListView?【英文标题】:How to display a two column ListView in Android? 【发布时间】:2011-01-26 20:07:38 【问题描述】:我有一个显示网格视图的 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 列具有二维数组的值(类似于 ASP.Net 中的 GridView - 作为数据源 -)。
我想展示:
1 |人 1
2 |人 2
3 |第三个人
4 |第 4 人
有什么想法吗?
【问题讨论】:
如果你能发布一张你想做什么的图片,那就太好了...... jayway.com/2014/02/17/a-multi-column-list 【参考方案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。
我的布局 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_
android:layout_
android:minHeight="?android:attr/listPreferredItemHeight"
android:mode="oneLine"
>
<TextView
android:id="@android:id/text1"
android:gravity="left"
android:layout_
android:layout_
android:layout_marginLeft="6dip"
android:layout_marginTop="6dip"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
android:id="@android:id/text2"
android:gravity="right"
android:layout_
android:layout_
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 参数是要用于每个 List 行的 View 的 ID、包含数据的游标、字符串数组,其中每个元素是游标中列的名称(按照获取它们的顺序)以及用于列表行中每个项目的视图的相应视图 ID 数组。
【讨论】:
谁能解释一下 mAuthor、mCopyright 成员?它们可以是数组吗?正如其“line1\nline2\nline3”所写的那样???这些不是光标中的行 - 它们是列表列,对吗? 我可以在这些 cloumns 上使用标题吗? +1 表示“_id”列异常部分,在我读到这篇笔记之前真的让我很头疼:)【参考方案2】:如果您找不到具有这些属性的现有适配器,您可以创建自己的自定义适配器并将其映射到您的视图。
Hello, GridView 教程展示了如何执行此操作。
【讨论】:
仅供参考,链接已失效 @Sealer_05 现在它重定向到通用的RecyclerVIew
教程。可能比让死者安息更令人困惑。【参考方案3】:
JRL 是对的,您应该编写自己的自定义适配器,它可以让您控制每行显示的内容。您可能会发现 this 很有帮助。更高级的例子可以在here http://developerlife.com/tutorials/?p=327找到。
如果您不想/必须使用列表,TableLayout 也可以显示您的数据。但这将是手动方法,因为您必须填写每个单元格。
最好的成功。
【讨论】:
【参考方案4】:为什么不创建一个类,其toString()
返回str(id) + " | " + personName
,并将其用作模板类而不是String
对象?
【讨论】:
【参考方案5】:您可以简单地将其添加到您的 XML android:numColumns="2"
【讨论】:
以上是关于如何在 Android 中显示两列 ListView?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio CardView 有两列宽度相等
如何在所有设备中使用 swift4 在 CollectionView 中显示两列