我正在使用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吗?我应该采取什么方法解决这个问题?
答案 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");
}
希望这有助于某人。