6

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

假设我有项目 A、B 和 C。如果我在过滤器框中键入 B,则只会显示项目 B,它是列表的位置 0(在位置 1 之前)。因此,当我调用 onClick 项目时,我得到了 id/位置 0,这导致显示有关 A 而不是 B 的详细信息。

这是点击代码:

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 具有相同的值。

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

谢谢

4

5 回答 5

4
 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 开始存储了名称和位置。因此您可以通过此获得确切位置

于 2013-10-22T13:35:34.660 回答
0

我认为问题在于您管理过滤器的方式。您应该不是从原始列表(或数组)而是从过滤的列表中获取具有选定 ID 的对象。

我在我的博客的这篇文章中使用了类似的东西。希望这对你有帮助

于 2012-12-06T09:58:27.527 回答
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 
}
于 2012-12-06T10:15:21.807 回答
0

你可以试试:

@Override
public boolean hasStableIds() {
    return false;
}

在您的适配器中

于 2012-12-06T10:15:29.807 回答
0

如果您使用的是数据库,您有 _id 键,您可以将其加载到过滤列表中作为不可见字段。单击该项目后,您可以使用 _id 键查询数据。如果您不使用数据库,您也可以在行元素中添加隐藏的 id 元素。

于 2016-01-25T13:02:19.997 回答