Событие onItemClick(AdapterView parent, View v, int position, long id) ведет себя не так, как хотелось бы.
Это нормальная ситуация при фильтрации адаптера. Хотя адаптер хранит ссылку на исходные нефильтрованные данные, со своей точки зрения, он имеет единственный набор данных, на котором основан (независимо от того, является ли он исходным или полученным в результате операции фильтрации). Но это не должно вызвать никаких проблем. С адаптерами sdk по умолчанию (или с подклассом) в onItemClick()
вы получаете position
для списка current, на котором основан адаптер. Затем вы можете использовать getItem()
, чтобы получить элемент данных для этого position
(опять же, это не имеет значения, исходный или отфильтрованный).
String data = getItem(position);
int realPosition = list.indexOf(data); // if you want to know the unfiltered position
это будет работать для списков и Maps
(при условии, что вы используете SimpleAdapter
). А для Maps
у вас всегда есть возможность добавить дополнительный ключ, чтобы установить нефильтрованную позицию в исходном списке.
Если вы используете свой собственный адаптер вместе с AutoCompleteTextView
, вы можете заставить onItemClick()
дать вам правильное id
(положение, однако, вы не можете изменить).
public class SpecialAutoComplete extends AutoCompleteTextView {
public SpecialAutoComplete(Context context) {
super(context);
}
@Override
public void onFilterComplete(int count) {
// this will be called when the adapter finished the filter
// operation and it notifies the AutoCompleteTextView
long[] realIds = new long[count]; // this will hold the real ids from our maps
for (int i = 0; i < count; i++) {
final HashMap<String, String> item = (HashMap<String, String>) getAdapter()
.getItem(i);
realIds[i] = Long.valueOf(item.get("id")); // get the ids from the filtered items
}
// update the adapter with the real ids so it has the proper data
((SimpleAdapterExtension) getAdapter()).setRealIds(realIds);
super.onFilterComplete(count);
}
}
и адаптер:
public class SimpleAdapterExtension extends SimpleAdapter {
private List<? extends Map<String, String>> mData;
private long[] mCurrentIds;
public SimpleAdapterExtension(Context context,
List<? extends Map<String, String>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
mData = data;
}
@Override
public long getItemId(int position) {
// this will be used to get the id provided to the onItemClick callback
return mCurrentIds[position];
}
@Override
public boolean hasStableIds() {
return true;
}
public void setRealIds(long[] realIds) {
mCurrentIds = realIds;
}
}
Если вы также реализуете класс Filter
для адаптера, вы можете получить оттуда идентификаторы без необходимости переопределять класс AutoCompleTextView
.
person
user
schedule
15.06.2013