我有一个列表视图,并且我已实现过滤。
假设我有项目A,B和C.如果我在过滤器框中输入B,则只显示项目B,它是列表的位置0(在它位于位置1之前)。因此,当我调用onClick项时,我得到id / position 0,这会导致显示有关A而不是B的详细信息。
这是onclick代码:
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Poi poi = pois.get((int)id);
goPOIDETAIL(poi);
}
});
id和position具有相同的值。
有没有办法获得原始位置,或者获得一些其他值来表示我点击的真实项目?
由于
答案 0 :(得分:2)
flashsearchList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Integer temp=flashSearchNameMap.get(adapter.getItem(position));
navigateSearch(temp);
}
});
(adapter.getItem(position)将返回确切的列表名称,在flashSearchNameMap中,我在应用过滤之前从oncreate开始存储了名称和位置。所以你可以通过这个获得准确的位置
答案 1 :(得分:0)
我认为问题在于您管理过滤器的方式。您应该从原始列表(或数组)中获取具有所选id的对象,而不是来自已过滤的对象。
我在blog的帖子中使用了类似的内容。希望这能帮到你
答案 2 :(得分:0)
ID 和索引不一样。当然,您可以在适配器的getItemId()
方法中返回项目索引,但如果这样做,则不要指望通过此方法正确识别您的项目。
尝试为您的每件商品提供唯一ID。这个想法有点类似于数据库中每条记录的ID,它永远不会改变(并且可以让您可靠地识别每条记录),并且当您从数据库获取数据时,它很容易实现。
但是如果您的商品没有唯一ID,并且您不想费心提供它们,那么还有另一种方法(请参阅下面的适配器示例代码):
public MyAdapter extends BaseAdapter {
private List<Item> items;
private List<Item> displayedItems;
public MyAdapter(List<Item> items) {
this.items=items;
this.displayedItems=items;
}
public filter(String query) {
if(query.isEmpty()) {
displayedItems=items;
} else {
displayedItems=new ArrayList<Item>();
for (Item item : items) {
displayedItems.add(...) //add items matching your query
}
}
notifyDataSetChanged();
}
//...
//NOTE: we use displayedItems in getSize(), getView() and other callbacks
}
答案 3 :(得分:0)
您可以尝试:
@Override
public boolean hasStableIds() {
return false;
}
适配器中的
答案 4 :(得分:0)
如果您使用的是数据库,则可以将_id键作为隐藏字段加载到筛选列表中。单击该项后,您可以使用_id键查询数据。 如果您没有使用数据库,也可以在行元素中添加隐藏的id元素。