0

在我的数据库类中有一个返回游标的方法。游标将包含来自不同表的数据:

public Cursor fetchFavTitles() {
    return myDataBase.rawQuery("SELECT rowid as _id, title, fav FROM table1 " +
                                "WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table2 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table3 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table4 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table5 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table6 WHERE fav = 1", null);

}

然后,我使用 aSimpleCursorAdapter ca附加Cursor到 a ListView lv

Cursor cursor = myDbHelper.fetchTitles(c);
String[] columns = {cursor.getColumnName(1)}; 
int[] columnsLayouts = {R.id.item_title};
ca = new SimpleCursorAdapter(this.getBaseContext(), R.layout.items_layout, cursor,columns , columnsLayouts);
lv = getListView();
lv.setAdapter(ca);

现在,如果我选择 ListView 中的任何项目,我想要引用该项目 ID。 我希望 id 从项目所属的表中检索其他信息。并在其他活动 MsgView 中检索它

我试过这个:

  • 对单击项目时传递的 id 的引用

  • 使用意图传递该值,以便其他活动将使用此传递的值检索所需的数据。

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
            Intent i = new Intent(view.getContext(), MsgView.class);
                i.putExtra("id", (int) id); //
                startActivity(i);
        }
        });
    

然而,这并没有奏效。看来我使用的 id 不是项目的 id !任何解决方案或想法?

4

5 回答 5

3

在 onItemClick 方法中试试这个......

final SimpleCursorAdapter simpleCursorAdapter = (SimpleCursorAdapter) parent.getAdapter();
final Cursor cursor = simpleCursorAdapter .getCursor();

final int idColIndex = cursor.getColumnIndex(KEY_ROWID); //_id column of your table
final int rowId = cursor.getInt(idColIndex);

在我的一个项目中使用的是链接参考第 41 行。希望这有帮助。

编辑:

解决了。看评论。

于 2011-07-11T13:25:48.947 回答
2

您想要位置参数而不是 id

参见 onItemClick 的文档:

public abstract void onItemClick (AdapterView<?> parent, View view, int position, long id) 

自:单击此 AdapterView 中的项目时要调用的 API 级别 1 回调方法。

如果实施者需要访问与所选项目关联的数据,他们可以调用 getItemAtPosition(position)。

参数

parent:发生点击的 AdapterView。

view:AdapterView 中被点击的视图(这将是适配器提供的视图)

position:视图在适配器中的位置。

id:被点击的项目的行id。

于 2011-07-11T13:21:32.793 回答
0

您可以在您的MsgView类中创建一个静态数据成员用于存储 id,或者您可以向类发送延迟消息,确保在消息到达之前加载并启动活动。

于 2011-07-11T13:21:47.297 回答
0

您可以使用View.setTag()View.getTag()方法在视图中存储任何数据。有时我利用它来为 ListView 中的每一行“标记”一个 Intent 对象。每当我需要查找一行的数据时,我只需使用 getTag() 获取 Intent

于 2011-07-11T13:24:54.163 回答
0

我找到了解决我的问题的方法。

虽然它不是专业的解决方案,但它是我现在唯一的一个。我在每个表中添加了一个名为:的新列,tableNumber以便每个表都有不同的编号。然后,我可以根据该数字区分项目。

感谢您的回答。特别感谢@gopal

于 2011-07-12T07:54:28.860 回答