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

我是全新的Android开发…来自iPhone和.Net背景。 我已经看到这个问题非常类似的问题,但没有一个处理SimpleCursorAdapter。

我有一个基本的ListActivity,它使用光标从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的正确方法吗? 这似乎很奇怪,因为我不认为我可以在数据库closures后(这是我绑定后)使用我的光标。 当我似乎无法find从该ID获取实际项目的方式时,传入的id的点是什么? 另外,我不明白为什么getItemAtPosition()会返回一个游标…游标绑定到整个列表; 不只是一排。 最后,如果这是正确的,那么获得光标所显示的两种方式有什么不同? 谢谢。

所以有几点:在你获取游标之后,你想调用startManagingCursor 。 这将游标的生命周期与Activity的生命周期联系在一起(所以当Activity被破坏时,游标被closures/清理)。

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

另外,数据库没有closures ,游标通常保持与数据库的实时连接(所以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)的最后一个参数),所以您实际上不需要再次获取它你当然可以如果你想燃烧周期)。 为了访问其他列,你可以做同样的事情,只是改变列索引。

希望有所帮助。

其他方式:

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