繁体   English   中英

Android:在列表视图中获取项目的位置给定其ID:

[英]Android: get position of item in a listview given its id:

getItemIdAtPosition()是android中的一个函数,用于获取列表视图中项目的id给定其位置

有没有办法做反过来,即获取项目的位置是一个列表视图给定其ID?

不,你必须手动完成。 在您正在使用的适配器中创建一个公共方法; 在该方法中,循环适配器项并检查每个项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;
}

不确定问题是否仍然存在。 尽管如此,我想我会分享我是如何做到的,以便它可以帮助那些想要做同样事情的人。

您可以使用视图的标记功能来存储该视图的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());
}

需要注意的一点是,您需要引用要查找其位置的视图。 如何掌握View的参考取决于您的具体情况。

不会。根据您用来支持ListView的适配器,id和位置可能是相同的(我没有查看所有BaseAdapter子类,所以我不能肯定地说)。 如果查看ArrayAdapter的源代码,您会看到getItemId实际上返回了适配器中对象的位置。 如果position和id相同,则不需要使用一个来获取另一个。 否则,您只需要在适配器中搜索您要查找的对象 - 使用位置或ID - 您就可以找到其他值。

如果您正在谈论的是使用一些独特的密钥(即您定义的密钥)来获取对象,那么就可以完成。 您需要做的是设置适配器以获取HashMap而不是ArrayList或常规的对象List 然后,您可以通过简单地从HashMap提取该值来创建自己的方法来按键查找。

回答为时已晚,但为了受益......
例如,如果你有listview,并且你想获得点击监听器的id,你可以通过>>获得它

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM