如何在ListView中找到特定项目的位置? (由SimpleCursorAdapter填充)。
我问的原因:listview设置为singleChoice模式。当用户关闭并重新打开应用程序时,我希望记住用户的选择。
到目前为止,我的方式是当用户点击某个项目时,所选项目的ID会保存到首选项中。我需要学习的是如何重新填充活动的onCreate方法中的项目。
我保存所选项目ID的代码:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Cursor c = (Cursor) l.getItemAtPosition(position);
selectedItem = c.getLong(c.getColumnIndex("_id"));
}
(我尝试使用Google搜索,但似乎只是找到了如何获得所选项目的位置)
谢谢!
答案 0 :(得分:15)
你应该试试
//SimpleCursorAdapter adapter;
final int position = adapter.getCursor().getPosition();
API文档:
public abstract int getPosition ()
自:API级别1
返回的当前位置 光标在行集中。价值是 从零开始。当行集是第一个时 返回光标将在positon -1,在第一行之前。在最后一行返回另一行之后 调用
next()
将离开光标 超过最后一个条目,在...的位置count()
。
<强>返回强> 当前光标位置。
<强>更新强>
根据适配器使用的ID获取项目的位置:
private int getItemPositionByAdapterId(final long id)
{
for (int i = 0; i < adapter.getCount(); i++)
{
if (adapter.getItemId(i) == id)
return i;
}
return -1;
}
根据基础对象的属性(成员值)获取项目的位置
//here i use `id`, which i assume is a member of a `MyObject` class,
//and this class is used to represent the data of the items inside your list:
private int getItemPositionByObjectId(final long id)
{
for (int i = 0; i < adapter.getCount(); i++)
{
if (((MyObject)adapter.getItem(i)).getId() == id)
return i;
}
return -1;
}
答案 1 :(得分:3)
我在自己的应用程序中直截了当地说:
long lastItem = prefs.getLong(getPreferenceName(), -1);
if (lastItem >= 0) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
if (lastItem == cursor.getLong(0)) {
spinner.setSelection(cursor.getPosition());
break;
}
cursor.moveToNext();
}
}
Spinner用光标的内容填充,所以我只是浏览它们并与所选的项目ID进行比较。在你的情况下,这将是一个ListView。
答案 2 :(得分:1)
当你说“...重新选择活动的onCreate方法中的项目......”时,你的意思是当用户返回ListView活动时,无论以前选择什么项目,现在都是屏幕(假设有足够的项目出现在它下面的列表中)?
如果是这样,那么从onListItemClick开始,您还应该努力保存position
的值,因为它会告诉您所选项目列表中的位置。这样您就不需要从_id
反向查找位置。
或者出于某种原因这不是您的选择吗?你真的需要找出_id
的位置吗?