从ListView中获取与SimpleCursorAdapter绑定的选定项

Gen*_*ari 37 android listview simplecursoradapter

我是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);
Run Code Online (Sandbox Code Playgroud)

然后单击某个项目时:

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);
}
Run Code Online (Sandbox Code Playgroud)

这是获取所选元素的id的正确方法吗?这看起来很奇怪,因为我不认为我可以在数据库关闭后使用我的光标(这是在我绑定之后).当我无法找到从该ID中获取实际项目的方法时,传入ID的重点是什么?另外,我不明白为什么getItemAtPosition()会返回一个游标......游标被绑定到整个列表; 不只是一排.最后,如果这是正确的,获得光标的两种方式之间是否存在差异?谢谢.

Fem*_*emi 82

所以有几点:在你拿到光标之后,你想要打电话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);
Run Code Online (Sandbox Code Playgroud)

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

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

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助.

  • 在APi11中不推荐使用startManagingCursor,您可能希望使用CursorLoader更新您的答案 (9认同)
  • @BjornTipling事实上你可以使用带有兼容性包的CursorLoaders,更新这样一个很棒的答案有什么不对. (2认同)