Android-SeparatedListAdapter-如何在onClick上获得准确的项目位置?
我使用Sharkey的SeparatedListAdapter类来获得一个由部分分隔的ListView 该类工作得很好,但我遇到的问题是我的Android-SeparatedListAdapter-如何在onClick上获得准确的项目位置?,android,Android,我使用Sharkey的SeparatedListAdapter类来获得一个由部分分隔的ListView 该类工作得很好,但我遇到的问题是我的onListItemClick()处理程序。如果我有以下分段列表: --------- | A | --------- | Alex | | Allan | --------- | B | --------- | Barry | | Bart | | Billy | | Brian | --------- | C | ------
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,而选择了你提供的链接。简单得多。:)。谢谢你的链接。