Отображение списка фильтров и получение правильного значения

У меня есть список, и я использую фильтрацию.

Допустим, у меня есть элементы 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 и позиция имеют одинаковое значение.

Есть ли способ получить исходную позицию или получить другое значение, указывающее реальный элемент, который я нажал?

благодаря

Я думаю, проблема в том, как вы управляете своим фильтром. Вы должны получить объект с выбранным идентификатором не из исходного списка (или массива), а из отфильтрованного.

Я использовал что-то подобное в этом посте из своего блога . Надеюсь, это поможет вам

  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 перед применением фильтрации. Таким образом, вы можете получить точную позицию этим

Идентификатор и индекс не совпадают. Конечно, вы можете вернуть индекс объекта в getItemId() вашего адаптера, но не ожидайте, что ваши элементы будут правильно идентифицированы с помощью этого метода, если вы это сделаете. Попробуйте предоставить уникальный идентификатор для каждого из ваших предметов. Идея несколько похожа на 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 } 

Можешь попробовать:

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

В вашем адаптере

Если вы используете datbase, у вас есть ключ _id, который можно загрузить в отфильтрованном списке как невидимое поле. Как только вы нажмете на элемент, вы можете запросить данные с помощью клавиши _id. Если вы не используете базу данных, вы можете добавить скрытый элемент id в свой элемент строки.