从与 SimpleCursorAdapter 绑定的 ListView 中获取所选项目
我是 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() 会返回一个光标...光标绑定到整个列表;不只是一排。最后,如果这是正确的,那么显示的两种获取光标的方法之间有区别吗?谢谢。
I'm brand new to Android development... coming from iPhone and .Net background. I've seen very similar questions to this one, but none of them dealt with the SimpleCursorAdapter.
I have a basic ListActivity which uses a Cursor to bind data from a SQLite query to my 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);
Then when an item is clicked:
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);
}
Is this the proper way to get the id of the element that was selected? It seems strange, because I wouldn't think I could use my cursor after the database is closed (which is is after I bind). What is the point of the id passed in, when I can't seem to find a way of getting the actual item from that id? Also, I don't understand why the getItemAtPosition() would return a cursor... the cursor is bound to the entire list; not just one row. Finally, if this is correct, is there a difference between the two ways shown of getting the cursor? Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
所以有几点:获取光标后,您需要调用startManagingCursor。这将游标的生命周期与活动的生命周期联系起来(因此,当活动被销毁时,游标将被关闭/清理)。
此外,数据库并未关闭,游标通常保持与数据库的实时连接(因此 ListView 可以滚动并执行可能需要将来访问游标内容的此类操作
。核心问题,在
onListItemClick
中执行此操作的最简单方法是:然后您可以使用
c.getLong(0)
来获取 id (假设您获取了 id 列作为第一列,通常是这种情况)。但是,请注意 id 作为签名的一部分传入(请参阅 public void onListItemClick(ListView l, View v, int position, long id) 中的最后一个参数)。 ),所以你真的不需要再次获取它(但如果你想烧掉循环,你当然可以)。为了访问其他列,你可以做同样的事情,只需更改列索引即可。So a couple of points: after you fetch the cursor, you want to call
startManagingCursor
. This ties the cursor's lifecycle with Activity's lifecycle (so when the Activity gets destroyed the cursor gets closed/cleaned up).Also, the database isn't closed, the Cursor typically keeps a live connection to the DB (so the ListView can scroll and do things of that nature that may require future access to the Cursor's contents.
To your core question, the easiest way to do it in
onListItemClick
is this:You can then use the
c.getLong(0)
to get the id (assuming you fetched the id column as the first column which is generally the case). However, note that the id is passed in as part of the signature (see the last argument inpublic void onListItemClick(ListView l, View v, int position, long id)
) so you really don't need to fetch it again (but you certainly can if you want to burn the cycles). For accessing other columns you can do the same thing, just change the column index.另一种方式:
Another way: