我是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()会返回一个光标......光标绑定到整个列表;而不仅仅是一行。最后,如果这是正确的,那么所示的两种获取光标的方法有什么区别吗?谢谢。
2条答案
按热度按时间igetnqfo1#
所以有几点:获取游标后,您需要调用
startManagingCursor
。这会将游标的生命周期与Activity的生命周期绑定在一起(因此,当Activity被销毁时,游标会被关闭/清理)。此外,数据库不是“关闭”的,Cursor通常保持与DB的实时连接(因此ListView可以滚动并执行将来可能需要访问Cursor内容的操作)。
对于您的核心问题,在
onListItemClick
中最简单的方法是:然后,可以使用
c.getLong(0)
获取该id(假设你把id列作为第一列,这是通常的情况)。但是,注意ID作为签名的一部分被传递(参见public void onListItemClick(ListView l, View v, int position, long id)
中的最后一个参数),因此您确实不需要再次获取它(但如果你想消耗周期,你当然可以)。对于访问其他列,你可以做同样的事情,只需改变列索引。sf6xfgos2#
另一种方式: