在ListView中获取一个项目的位置?

9
如何在ListView中查找特定项的位置?(由SimpleCursorAdapter填充)
我提出这个问题的原因是:ListView设置为单选模式。当用户关闭并重新打开应用程序时,我希望记住用户的选择。
到目前为止,我的做法是当用户点击一个项目时,将所选项目的ID保存到首选项中。我需要学习的是如何在Activity的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"));
}

我曾经尝试过搜索,但似乎只能找到如何获取选定项的位置。谢谢!
3个回答

16
你应该尝试。
//SimpleCursorAdapter adapter;
final int position = adapter.getCursor().getPosition();

API文档:

public abstract int getPosition () 

自API Level 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;
}

根据底层对象的属性(成员值)获取项的位置。

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

谢谢!但是,如果给定一个ID,我该如何查找一个项目的位置呢? - Jodes
(抱歉,希望我不会过于迟钝!!) - Jodes
不用担心。你是指渲染的底层对象中的成员id,还是适配器使用的id(如果它们不同)?无论如何,我刚刚更新了答案,也许它涵盖了你所需要的内容。 - rekaszeru
我觉得我还有很多东西要学习,因为我不认为我在追求这两个ID之一(哈哈!)我想要的是给定sqlite数据库中“_id”字段的项目位置。但我猜我的方法不太好,我需要认真考虑你的建议,谢谢! - Jodes
如果您不断更改问题,那么没有一个答案会被批准,并且实际上好的答案会被弃用(错误!):( 您最好提出一个新问题,并将此问题链接到它。另一方面:listview项数据的结构是什么(从数据库获取的数据的java类)?知道这一点,也会更容易帮助您解决这个问题。 - rekaszeru
非常抱歉!关于您的问题,我很困惑。如果这回答了您的问题,我还没有编写一个适用于listview项目数据类型的类?但是我认为我的代码有点取巧,实际上只是在自定义SimpleCursorAdapter的重写bindView方法中使用游标。我现在也许应该开始一个新的问题哈哈。感谢您的帮助(以及其他所有人的帮助,我认为现在只能勉强应付!这里有很多要考虑的事情)。 - Jodes

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(列表视图)。


这正是我想要的效果!我希望找到一种避免需要迭代所有项目的方法,但也许是不可避免的。谢谢。 - Jodes
很棒的代码。真的帮了大忙,没有修改的地方,谢谢。 - j2me
这可能是最快的解决方案,因为它直接使用后端数据而不是视图或适配器。 - WindRider

1

当您说“...在活动的onCreate方法中重新选择项目...”时,您是否意味着当用户返回到ListView活动时,先前选择的任何项目现在当前位于屏幕顶部(假设足够的项目出现在其下面的列表中)?

如果是这样,那么从onListItemClick开始,您还应该努力保存position的值,因为它告诉您所选项在列表中的位置。这将允许您无需从_id中进行反向查找即可确定位置。

或者,由于某些原因,这对于您的目的来说不是一个选项?您真的需要从_id中确定位置吗?


谢谢,Than,是的,那正是我想表达的。我认为使用位置可能不是一个好主意,但也许最终我会采用这种方法。 - Jodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接