Android-SeparatedListAdapter-如何在onClick上获得准确的项目位置?

Android-SeparatedListAdapter-如何在onClick上获得准确的项目位置?,android,Android,我使用Sharkey的SeparatedListAdapter类来获得一个由部分分隔的ListView 该类工作得很好,但我遇到的问题是我的onListItemClick()处理程序。如果我有以下分段列表: --------- | A | --------- | Alex | | Allan | --------- | B | --------- | Barry | | Bart | | Billy | | Brian | --------- | C | ------

我使用Sharkey的SeparatedListAdapter类来获得一个由部分分隔的ListView

该类工作得很好,但我遇到的问题是我的
onListItemClick()
处理程序。如果我有以下分段列表:

---------
| A     |
---------
| Alex  |
| Allan |
---------
| B     |
---------
| Barry |
| Bart  |
| Billy |
| Brian |
---------
| C     |
---------
etc...
当您想要单击列表中的某个项目时,您可以获得该项目的
位置
,然后对其进行处理

在我的例子中,我的列表是一个动态的人名列表。这些名称来自一个数据库,该数据库在进入列表之前被放入一个
列表中。对我来说,知道我单击的项目的位置很重要,因为我使用项目
位置
来确定列表对象中有关此人的其他信息

现在,问题是: 当您单击列表中的某个项目时,标题将计为项目,即使它们不可查找。在上面的示例中,列表中的位置如下

Alex = 1
Allan = 2
Barry = 4
Bart = 5
Billy = 6
Brian = 7
但在我最初的
列表中
对象的顺序是这样的

Alex = 0
Allan = 1
Barry = 2
Bart = 3
Billy = 4
Brian = 5
因此,每当我点击一个项目,比如Alex,我的代码就会运行
onClick
处理程序,确定Alex在中的位置
1
,然后从
列表中检索Allans信息,而不是Alex的信息

你看到这里的delima了吗?我应该采取什么方法来解决这个问题?

您可以对
列表视图中的每个项目使用
setTag()
。这可以通过在从
listAdapter
中的
getView()
函数返回视图之前添加此标记来完成。假设列表适配器返回
convertView
,然后返回列表适配器

    public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null)
            {
                convertView = mLayoutInflater.inflate(R.layout.morestores_list_item, null);
                holder = new ViewHolder();

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            // populate holder here, that is what you get in onItemClick.
                    holder.mNameofItem = "NameofaPerson";
            return convertView;
        }

static class ViewHolder {
        TextView mName;
        Button mAction;
        ImageView mLogo;
            // use this class to store the data you need, and use appropriate data types.
            String mNameofItem.
    }
单击列表项时,请使用

public void onItemClick(AdapterView<?> arg0, View convertView, int arg2,
            long arg3) {
                ViewHolder holder = (ViewHolder) convertView.getTag();
                // holder has what ever information you have passed.
                String nameofItemClicked = holder.mNameofItem;
                // access the information like this.
    }
public-void-onItemClick(AdapterView arg0、View-convertView、int arg2、,
长arg3){
ViewHolder=(ViewHolder)convertView.getTag();
//持有者拥有您所传递的任何信息。
字符串nameofItemClicked=holder.mNameofItem;
//像这样访问信息。
}
这种方法不需要项目在列表中的位置,只是想让您知道不同的方法


HTH.

我的解决方案不是获取列表中的位置,然后使用该位置从ListArray或Hash中获取对象,只是在适配器中获取该位置的对象,然后从中检索我需要的任何自定义参数或方法。现在有点明显,但一开始没有意义

更新 这是一段很长的代码,因此我只提供一个概述:

传入自定义对象,而不是为列表项传入字符串。假设该对象存储了两个不同的值。名称(可通过公共方法
getName()
检索)和ID(可通过
getId()
检索)

您必须重写适配器类的
getView()
方法,使其使用对象的
getName()
方法,并使用该文本显示在列表项中

然后,单击项目时,只需从该位置的适配器获取对象,然后获取ID:

int id = adapter.get(position).getId();
// Then do something with the ID, pass it to an activity/intent or whatever.
此外,我还放弃了分离的ListViewAdapter,转而使用。更好、更灵活

 int idNo= adapter.get(position).getId();

您可以尝试此代码…

对于任何其他人,我最近遇到了此问题并最终解决了此问题,我通过以下方法解决了此问题:

首先更改地图以获取“id”

public Map<String,?> createItem(String title, String caption, String id) { 
  Map<String,String> item = new HashMap<String,String>(); 
  item.put(ITEM_TITLE, title); 
  item.put(ITEM_CAPTION, caption); 
  item.put("id", id); // Add a unique id to retrieve later
  return item;}
publicmap-createItem(字符串标题、字符串标题、字符串id){
Map item=newhashmap();
项目名称(项目名称、标题);
项目.放置(项目标题,标题);
item.put(“id”,id);//添加一个唯一的id以便以后检索
返回项;}
第二,添加节时,请确保包含id:

 List<Map<String,?>> GeneralSection = new LinkedList<Map<String,?>>(); 
          GeneralSection.add(createItem(FirstName[GeneralInt] + " " + LastName[GeneralInt], Whatever[GeneralInt], UniqueId[GeneralInt]));   
//Unique id could be populated anyway you like, database index 1,2,3,4.. for example like above question.
          adapter.addSection("GeneralSection ", new SimpleAdapter(getActivity(), GeneralSection , R.layout.list_complex, 
            new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));
List GeneralSection=new LinkedList();
添加(createItem(FirstName[GeneralInt]+“”+LastName[GeneralInt],任意[GeneralInt],UniqueId[GeneralInt]);
//唯一id可以按任意方式填充,数据库索引1,2,3,4。。比如像上面的问题。
adapter.addSection(“GeneralSection”,新的SimpleAdapter(getActivity(),GeneralSection,R.layout.list_complex,
新字符串[]{ITEM_TITLE,ITEM_CAPTION},新int[]{R.id.list_complex_TITLE,R.id.list_complex_CAPTION});
最后,使用ItemClickListener中的映射检索正确位置的“id”:

  @Override
        public void onItemClick(AdapterView<?> arg0,  View v, int position, long arg3) {
            // TODO Auto-generated method stub

            Map<String, String> map = (Map<String, String>) arg0.getItemAtPosition(position);
            String UniqueId = map.get("id");
            Log.i("Your Unique Id is", UniqueId); 
//Can then use Uniqueid for whatever purpose
//or any other mapped data for that matter..eg..String FirstName = map.get("ITEM_TITLE");


    }
@覆盖
public void onItemClick(AdapterView arg0,视图v,内部位置,长arg3){
//TODO自动生成的方法存根
Map Map=(Map)arg0.getItemAtPosition(位置);
字符串UniqueId=map.get(“id”);
Log.i(“您的唯一Id为”,UniqueId);
//然后可以将Uniqueid用于任何目的
//或任何其他与此相关的映射数据。例如,String FirstName=map.get(“ITEM_TITLE”);
}

希望这对其他人有所帮助。

你能给我一些代码吗?谢谢,我也放弃了单独的ListViewAdapter,而选择了你提供的链接。简单得多。:)。谢谢你的链接。