过滤列表视图并获取正确的onclick项目

时间:2012-12-06 02:56:43

标签: android listview android-listview

我有一个列表视图,并且我已实现过滤。

假设我有项目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具有相同的值。

有没有办法获得原始位置,或者获得一些其他值来表示我点击的真实项目?

由于

5 个答案:

答案 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元素。