Java 获取项目在ListView中的位置?

Java 获取项目在ListView中的位置?,java,android,Java,Android,如何在ListView中找到特定项的位置?(由SimpleCursorAdapter填充) 我问的原因是:listview设置为singleChoice模式。当用户关闭并重新打开应用程序时,我希望记住用户的选择 到目前为止,我的做法是,当用户单击某个项目时,所选项目的ID将保存到首选项中。我需要学习的是如何在活动的onCreate方法中重新选择已重新填充的项 保存所选项目ID的我的代码: @Override protected void onListItemClick(ListView

如何在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"));
}
(我尝试过谷歌搜索,但似乎只找到了如何获取所选项目的位置)

谢谢

你应该试试看

//SimpleCursorAdapter adapter;
final int position = adapter.getCursor().getPosition();
API文档:

public abstract int getPosition () 
自:API级别1

返回对象的当前位置 光标位于行集合中。价值是 零基。当行集合为第一行时 返回光标将位于位置 -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;
}
private int getItemPositionByAdapterId(最终长id)
{
对于(inti=0;i
基于基础对象的属性(成员值)获取项目位置的步骤

//这里我使用'id',我假设它是'MyObject'类的成员,
//此类用于表示列表中项目的数据:
私有int getItemPositionByObjectId(最终长id)
{
对于(inti=0;i
当您说“…在活动的onCreate方法中重新选择项目…”时,您的意思是当用户返回ListView活动时,以前选择的任何项目现在都位于屏幕顶部(假设下面的列表中出现了足够的项目)

如果是,那么从onListItemClick,您还应该努力保存
位置的值,因为它告诉您所选项目列表中的位置。这将允许您不需要从
\u id
反向查找位置


或者出于某种原因,这不是你的选择吗?你真的需要从
\u id
中找出位置吗?

我在自己的应用程序中直接做到这一点:

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

微调器中填充了光标的内容,因此我只需查看它们并与所选项目id进行比较。在您的情况下,这将是一个列表视图。

谢谢!但是,如果给定一个ID,我将如何查找项目的位置?(对不起,我希望我没有过于密集!!)不用担心。您是指作为呈现的基础对象的成员的id,还是适配器使用的id(如果它们不相同)?不管怎样,我只是更新了答案,也许它涵盖了您需要的内容。我想我需要做一些学习,因为我不认为我在寻找这些id中的任何一个(LOL!),我想要在sqlite db中给定其“_id”字段的项的位置。但我猜我的方法不是一个好方法,我必须仔细考虑你的建议,谢谢!如果你不断修改你的问题,没有一个答案会被批准,而实际上好的答案会被否决(错误!):(你最好问一个新问题,并将这个问题链接到它。另一方面:
listview
项的数据结构是什么(从数据库中获得的数据的java类)知道这一点也会更容易帮你解决这个问题。Thane,谢谢你,是的,这正是我的意思。我不认为使用这个职位是个好主意,但也许我最终会求助于它。这就是我一直在寻找的效果!我希望找到一种方法来解决需要重复所有项目的问题,但这可能是徒劳的dable.Thanksgreat一段代码。没有修改Thanks的地方真的很有帮助。这可能是最快的解决方案,因为它直接处理备份数据,而不是视图或适配器。
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();
    }
}