イベント onItemClick(AdapterView parent, View v, int position, long id) が思い通りに動作しません。
これは、アダプタをフィルタリングするときの通常の状況です。アダプターは、フィルター処理されていない最初のデータへの参照をその観点から保持しますが、基になる単一のデータ セットがあります (それが最初のデータであるか、フィルター操作の結果であるかは関係ありません)。しかし、これで問題が発生することはありません。デフォルトの sdk アダプター (またはサブクラス) を使用すると、アダプターが基づいている現在のリストを取得onItemClick()
できます。次に、そのデータ項目を取得するために使用できます(ここでも、初期かフィルターかは問題ではありません)。position
getItem()
position
String data = getItem(position);
int realPosition = list.indexOf(data); // if you want to know the unfiltered position
これは、リストとMaps
(を使用すると仮定してSimpleAdapter
) で機能します。また、 a の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
クラスをオーバーライドしなくても、そこから ID を取得できますAutoCompleTextView
。