38

我是 Android 开发的新手……来自 iPhone 和 .Net 背景。我见过与这个问题非常相似的问题,但没有一个涉及 SimpleCursorAdapter。

我有一个基本的 ListActivity,它使用 Cursor 将 SQLite 查询中的数据绑定到我的 ListView:

ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {android.R.id.text1}); 

setListAdapter(adapter);

然后当一个项目被点击时:

public void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position,  id);

    //Difference between this:
    Cursor c = (cursor)l.getItemAtPosition(position);
    //and this??
    Cursor c = (Cursor)l.getAdapter().getItem(position);

    int categoryId = c.getInt(0);
}

这是获取所选元素的 id 的正确方法吗?这似乎很奇怪,因为我认为在数据库关闭后(即在我绑定之后)我不能使用我的光标。当我似乎无法找到从该 id 获取实际项目的方法时,传入的 id 有什么意义?另外,我不明白为什么 getItemAtPosition() 会返回一个游标......游标绑定到整个列表;不只是一排。最后,如果这是正确的,那么显示的两种获取光标的方式有区别吗?谢谢。

4

2 回答 2

83

所以有几点:在你获取光标之后,你想调用startManagingCursor. 这将游标的生命周期与 Activity 的生命周期联系起来(因此当 Activity 被销毁时,游标会被关闭/清理)。

startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {android.R.id.text1}); 
setListAdapter(adapter);

此外,数据库未关闭,游标通常与数据库保持实时连接(因此 ListView 可以滚动并执行可能需要将来访问游标内容的那种性质的事情。

对于您的核心问题,最简单的方法onListItemClick是:

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);

然后,您可以使用c.getLong(0)来获取 id(假设您将 id 列作为第一列获取,这通常是这种情况)。但是,请注意 id 是作为签名的一部分传入的(请参阅 中的最后一个参数public void onListItemClick(ListView l, View v, int position, long id)),因此您确实不需要再次获取它(但如果您想烧掉循环,您当然可以)。要访问其他列,您可以执行相同的操作,只需更改列索引。

希望有帮助。

于 2011-05-27T19:43:21.257 回答
2

其他方式:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);
            //TODO
            }
});
于 2015-09-15T17:08:32.207 回答