【问题标题】:Filtering list view and getting correct onclick item过滤列表视图并获得正确的 onclick 项目
【发布时间】:2012-12-06 02:56:43
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 您在哪里刷新(过滤)数据?
  • 通过 'id' 获取正确的索引?
  • 在过滤自身时,获取所有过滤后的数据值(例如,如果它有 name 和 id ,有 2 个数组)并将它们分别添加到新数组中,并通过使新添加的数组无效来设置列表视图列表中的前视图。所以现在即使他们的位置改变了,onclick 也可以正常工作。

标签: android listview android-listview


【解决方案1】:
 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 开始存储名称和位置。因此您可以通过此获得确切位置

【讨论】:

  • 你试过了吗,告诉我
【解决方案2】:

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

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

【讨论】:

  • 是的,愚蠢的错误。感谢您让我意识到,pois.get(id) 是在原始列表中搜索,而不是在过滤后的列表中搜索。
  • 我的情况会怎样............请帮助......stackoverflow.com/questions/20606766/…
  • 嗨,无法打开解决方案的给定链接
  • 复制粘贴链接就行了,不知道为什么不行!
【解决方案3】:

ID 和 Index 不一样。当然,您可以在适配器的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 
}

【讨论】:

    【解决方案4】:

    你可以试试:

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

    在您的适配器中

    【讨论】:

    • 我在我的 CustomList 适配器中添加了你所说的内容,它的定义如下: public class CustomListAdapter extends ArrayAdapter implements Filterable{ ...} but didn't work :(
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多