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

xyhw6mcr  于 2022-12-25  发布在  Android
关注(0)|答案(2)|浏览(174)

我是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()会返回一个光标......光标绑定到整个列表;而不仅仅是一行。最后,如果这是正确的,那么所示的两种获取光标的方法有什么区别吗?谢谢。

igetnqfo

igetnqfo1#

所以有几点:获取游标后,您需要调用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);

此外,数据库不是“关闭”的,Cursor通常保持与DB的实时连接(因此ListView可以滚动并执行将来可能需要访问Cursor内容的操作)。
对于您的核心问题,在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)中的最后一个参数),因此您确实不需要再次获取它(但如果你想消耗周期,你当然可以)。对于访问其他列,你可以做同样的事情,只需改变列索引。

sf6xfgos

sf6xfgos2#

另一种方式:

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
            }
});

相关问题