3

我在由数据库表填充的 ListActivity 中有一个 ListView。ListView 的每一行都是一个RelativeLayout,其中包含三个TextView,依次命名为rowid、date 和name。我可以使用 ListView 的 .setSelection(int position) 方法以编程方式选择单个行。

这是我想要做的:当我按下界面上的按钮时,从当前选择的列表行中获取 rowid,并使用 rowid 执行数据库查询。我不知道如何从列表本身中获取 rowid。rowid 可能与列表中的 ID 或位置不同,因为它是数据库中的 rowid。

我怀疑这将需要使用适配器,但我已经尝试/搜索了一周的网络并且无法解决这个问题。感谢任何人都可以提供的帮助。

4

2 回答 2

3

您知道当前选定项目的列表位置,在 ListView 之外有一个按钮应该触发对该项目的某些操作,并且您不只是使 ListView 行(或每行中的某些子视图)可点击。正确的?

您可以从列表的适配器获取信息。getItem(int position) 返回位置列表项表示的对象,因此如果它存储在对象中,您可以直接检索所需的信息。getView(int position) 返回该行的视图,允许您使用 findViewById(int id) 来检索您的 TextView。

如果您还没有适配器,您可以使用 getAdapter() 从 ListView 中获取它。

// ListView myListView = the ListView in question
// int selectedRow = the currently selected row in the ListView
// Each row in the ListView is backed by an object of type MyCustomDataClass

int dbRowId;
Adapter adapter = myListView.getAdapter();

MyCustomDataClass data = (MyCustomDataClass) adapter.getItem(selectedRow);
dbRowId = data.getDatabaseRowId();
// OR
dbRowId = data.rowId;
// OR whatever method the object has for getting the ID.

// OR
View listViewRow = adapter.getView(selectedRow);
TextView dbRowView = (TextView) listViewRow.findViewById(R.id.rowid);
String dbRowAsString = dbRowView.getText().toString();
dbRowId = Integer.parseInt(dbRowAsString);

您可能还会考虑用户是否更自然地点击 ListView 行,而不是选择该行然后按下另一个按钮。雷诺的答案可能会更好。

于 2011-02-24T06:07:06.137 回答
1

我最终使用带有以下代码的最后一种方法。

int dbRowId;
Adapter adapter = myListView.getAdapter();

View listViewRow = adapter.getView(selectedRow);
TextView dbRowView = (TextView) listViewRow.findViewById(R.id.rowid, null, null);
String dbRowAsString = dbRowView.getText().toString();
dbRowId = Integer.parseInt(dbRowAsString);

我必须做的唯一更改是在 .findViewByID 的参数中添加 null、null

TextView dbRowView = (TextView) listViewRow.findViewById(R.id.rowid, null, null);
于 2011-02-24T23:38:17.000 回答