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

时间:2011-09-22 22:59:53

标签: android

我正在使用Sharkey的SeparatedListAdapter类,以便有一个由各个部分分隔的ListView。

该课程效果很好,但我遇到的问题是我的onListItemClick()处理程序。如果我有以下部分列表:

---------
| A     |
---------
| Alex  |
| Allan |
---------
| B     |
---------
| Barry |
| Bart  |
| Billy |
| Brian |
---------
| C     |
---------
etc...

当您想要点击列表中的某个项目时,您会获得该项目的position,然后对其执行某些操作。

在我的情况下,我的列表是一个人名的动态列表。这些名称来自于在进入列表之前放入List<CustomClass>的数据库。了解我点击的项目的位置非常重要,因为我使用项目position来确定有关List对象中人员的其他信息。

现在,问题是: 单击列表中的项目时,标题将计为项目,即使它们不可点击。在上面的例子中,列表中的位置如下

Alex = 1
Allan = 2
Barry = 4
Bart = 5
Billy = 6
Brian = 7

但在我原来的List对象中,订单就是这样

Alex = 0
Allan = 1
Barry = 2
Bart = 3
Billy = 4
Brian = 5

因此,每当我点击像Alex这样的项目时,我的代码就会运行onClick处理程序,确定Alex位于1的位置,然后从List检索Allans信息而不是Alex的。

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

4 个答案:

答案 0 :(得分:7)

您可以setTag()用于listView中的每个项目。这可以通过在getView()中从listAdapter函数返回视图之前添加此标记来完成。让我们说你的列表适配器返回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.
    }

这种方法不需要列表中项目的位置,只是想让你知道不同的方法。

HTH。

答案 1 :(得分:1)

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

<强>更新 这是一长串代码,所以我只想概述一下:

不是传入列表项的String,而是传入自定义对象。让我们说这个对象有两个不同的值存储。名称(可通过公共方法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.

我也抛弃了SeparatedListViewAdapter,转而使用this。更好,更灵活的imo。

答案 2 :(得分:1)

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

你可以尝试这段代码......

答案 3 :(得分:1)

对于其他任何人我最近都遇到了这个问题并最终到了这里,我解决了:

首先改变地图以获取'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;}

第二次添加部分时,请确保包含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 }));

最后在ItemClickListener中使用Map来检索正确位置的“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");


    }

希望这有助于某人。