Android:根据id获取ListView中项目的位置

10

getItemIdAtPosition()是Android中的一个函数,用于根据位置获取列表视图中项目的ID。

是否有一种方法可以实现反向操作,即根据ID获取列表视图中项目的位置?

(注:原文已经很通俗易懂,翻译时只需转换语言即可)

1
你会有一个支持你的列表视图的数组或者数组列表,对吧?我很确定你可以使用它来实现这个。 - midhunhk
4个回答

13

不行,您必须手动完成。在您使用的适配器中创建一个公共方法; 在该方法中,循环适配器项目并检查每个项目的ID。如果它等于方法参数,则返回索引。

public int getItemPosition(long id)
{
    for (int position=0; position<mList.size(); position++)
        if (mList.get(position).getId() == id)
            return position;
    return 0;
}

更新: 如果查找性能是您使用情况的问题,您可以在适配器中保存一个位置/ID的HashMap。

更新: 如果您想在适配器之外使用此方法,请使用以下内容:

private int getAdapterItemPosition(long id)
{
    for (int position=0; position<mListAdapter.getCount(); position++)
        if (mListAdapter.get(position).getId() == id)
            return position;
    return 0;
}

你需要明白这取决于你的适配器包含了什么...不过,上面是代码。 - Bogdan Zurac
请问您能告诉我如何实现相同的功能吗?因为我不知道如何获取那个数组,可以给出列表视图和ID。@安德鲁 - user2595281
我不太明白你的问题... 我猜你没有使用自定义适配器?如果没有,你需要创建一个,因为你不能将这个方法添加到Android的BaseAdapter类中。 - Bogdan Zurac
我猜这个人要求你编写一个函数,使其接受一个ListView参数和一个ID参数,并返回位置。假设他有一个ArrayAdapter。 - tenstar
@Kurztipp 如果您认为代码存在问题,请在评论中提出,而不是尝试编辑问题,谢谢! - serakfalcon

4

不确定问题是否仍然存在。但是,我想分享一下我是如何做到的,以便帮助那些正在寻找相同解决方案的人。

您可以使用视图的标记功能来存储该视图的ID与其在列表中的位置之间的映射关系。

Android开发者网站上的标记文档解释得非常清楚:

http://developer.android.com/reference/android/view/View.html#Tags

http://developer.android.com/reference/android/view/View.html#setTag(int, java.lang.Object)

http://developer.android.com/reference/android/view/View.html#getTag(int)

例如: 在您的列表适配器的getView方法中,您可以设置该视图的ID与其在列表中的位置之间的映射关系,例如:

public View getView (int position, View convertView, ViewGroup parent)
{
     if(convertView == null)
     {
          // create your view by inflating a xml layout resource or instantiating a
          // custom view class
     }
     else
     {
          // Do whatever you want with the convertView object like
          // finding a child view that you want to set some property of,etc.  
     }

     // Here you set the position of the view in the list as its tag
     convertView.setTag(convertView.getId(),position);

     return convertView;
}

要检索视图的位置,您可以执行以下操作:

int getItemPosition(View view)
{
    return view.getTag(view.getId());
}

需要注意的一点是,您确实需要引用要检索位置的视图。如何获取视图的引用取决于您的具体情况。


0

已经太晚回答了,但是为了帮助...
例如,如果你有一个ListView,并且你想通过点击监听器获取ID,你可以通过& gt;>来获得它。

cListview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {


          @Override
                    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
              // for id or any informations

                                itemID = String.valueOf(catList.get(position).getItemID());

// for name or any informations

                                    itemName = String.valueOf(catList.get(position).getItemName());

0
不一定。根据您用于支持您的ListView的适配器类型,id和位置可能相同(我还没有查看所有BaseAdapter子类,因此无法确定)。如果您查看ArrayAdapter的源代码,您将看到getItemId实际上返回适配器中对象的位置。如果位置和id相同,则无需使用一个来获取另一个。否则,您只需要使用位置或id在适配器中搜索要查找的对象,就可以找到另一个值。
如果您所说的是使用某个唯一键获取对象-即您定义的键-那么可以做到这一点。您需要做的是设置适配器以采用HashMap而不是对象的ArrayList或常规List。然后,您可以创建自己的按键查找方法,只需从HashMap中提取该值即可。

1
根本不可能。例如,CursorAdapters。更不用说大多数,如果不是全部的自定义适配器了。因此,完全不能依赖于值相同的想法。至于HashMap,是列表查找方法的替代品。这取决于您的需求。 - Bogdan Zurac
如果您编写了自定义适配器,那么一切都无法保证。没有考虑到CursorAdapter,这是一个很好的观点。然而,使用HashMap仍然是最简单/最快捷的方法来完成这个任务。 - Rarw

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