Cómo obtener el ID correcto del adaptador AutoCompleteTextView

Soy nuevo en el desarrollo de Android y me encontré con un problema que me resulta difícil de resolver. Estoy intentando calcular hacia fuera cómo utilizar un widget de AutoCompleteTextView correctamente. Quiero crear un AutoCompleteTextView , utilizando datos XML de un servicio web. Me las arreglé para conseguir que funcione, pero estoy defenitely no contento con la salida.

Me gustaría poner un HashMap con id => pares de nombre en el AutoCompleteTextView y obtener el id del elemento seleccionado. Cuando hago clic en la salida de conjunto filtrada de autocompletar, quiero rellenar una lista debajo del cuadro de autocompletado, que también logré que funcione.

Hecho hasta ahora:

  • Autocompletar funciona bien para ArrayList simple, todos los datos filtrados correctamente
  • onItemClick evento onItemClick se onItemClick correctamente después de hacer clic
  • parent.getItemAtPosition(position) devuelve la representación correcta de String del elemento seleccionado

El evento onItemClick(AdapterView parent, View v, int position, long id) no se comporta como me gustaría. ¿Cómo puedo averiguar la posición no filtrada de la matriz del elemento pulsado? La posición de la filtrada es la que no me interesa.

Mas preguntas:

  • Cómo manejar HashMaps o Collections en AutoCompleteTextView
  • Cómo obtener el itemId correcto en el evento onItemClick

Hice una investigación muy extensa sobre este tema, pero no encontré ninguna información valiosa que pudiera responder a mis preguntas.

El evento onItemClick (padre de AdapterView, View v, int position, id largo) no se comporta como me gustaría.

Esta es una situación normal al filtrar un adaptador. Aunque el adaptador mantiene una referencia a los datos no filtrados iniciales desde su punto de vista, tiene un único conjunto de datos en el que se basa (no importa si es el inicial o resultado de una operación de filtro). Pero esto no debería plantear ningún problema. Con los adaptadores sdk predeterminados (o con una subclase), en onItemClick() obtendrá la position para la lista actual en la que se basa el adaptador. A continuación, puede utilizar getItem() para obtener el elemento de datos para esa position (de nuevo, no importa si inicial o filtrado).

 String data = getItem(position); int realPosition = list.indexOf(data); // if you want to know the unfiltered position 

Esto funcionará para listas y Maps (suponiendo que utilice SimpleAdapter ). Y para un Maps siempre tiene la opción de agregar una clave adicional para establecer la posición no filtrada en la lista inicial.

Si utiliza su propio adaptador junto con un AutoCompleteTextView , puede hacer que onItemClick() dé el id correcto (la posición sin embargo no puede cambiar).

 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); } } 

Y el adaptador:

 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; } } 

Si también implementa la clase de Filter para el adaptador, puede obtener los identificadores de allí sin necesidad de anular la clase AutoCompleTextView .

Usando el acercamiento de Luksprog, hice algo similar con ArrayAdapter.

  public class SimpleAutoCompleteAdapter extends ArrayAdapter<String>{ private String[] mData; private int[] mCurrentIds; public SimpleAutoCompleteAdapter(Context context, int textViewResourceId, String[] objects) { super(context, textViewResourceId, objects); mData=objects; } @Override public long getItemId(int position) { String data = getItem(position); int index = Arrays.asList(mData).indexOf(data); /* * Atention , if your list has more that one same String , you have to improve here */ // this will be used to get the id provided to the onItemClick callback if (index>0) return (long)mCurrentIds[index]; else return 0; } @Override public boolean hasStableIds() { return true; } public void setRealIds(int[] realIds) { mCurrentIds = realIds; } } 

Implementar onItemClickListener para AutoCompleteTextView, a continuación, use indexOf en su lista para encontrar el índice del elemento seleccionado.

 actvCity.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { int index = cityNames.indexOf(actvCity.getText().toString()); // Do Whatever you want to do ;) } }); 

Primero agrega tus datos a arraylist personalizado

  // mList used for adding custom data into your model private List<OutletListSRModel> mList = new ArrayList<>(); // listdata used for adding string data for auto completing. ArrayList<String> listdata = new ArrayList<String>(); for (int i = 0; i < JArray.length(); i++) { JSONObject responseJson = JArray.getJSONObject(i); OutletListSRModel mModel = new OutletListSRModel(); mModel.setId(responseJson.getString("id")); mModel.name(responseJson.getString("outlet_name")); listdata.add(responseJson.getString("outlet_name")); } ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, listdata); searchOutletKey.setAdapter(adapter); 

Ahora para obtener cualquier valor del modelo que hemos añadido anteriormente. Podemos conseguir así.

 searchOutletKey.setOnItemClickListener ( new AdapterView.OnItemClickListener ( ) { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String txtOutletId = mOutletListSRModel.get(position).getId(); } }); 
  • Android cómo hacer que AutoCompleteTextView funcione como cuadro de búsqueda de google
  • Barra de Acción Android SearchView as Autocomplete?
  • Android autocompletetextview sugerencia resultados ocultos bajo teclado
  • Comportamiento extraño de AutoCompleteTextView en el dispositivo LolliPop
  • Cómo agregar el oyente a autocompletetextview, android?
  • AutocompleteTextView de Android con ArrayAdapter y Filter
  • Eliminar subrayado de AutoCompleteTextView a través de xml
  • Diacríticos / caracteres internacionales en AutoCompleteTextView
  • Android: AutoCompleteTextView con sugerencias predeterminadas
  • Cambiar filtro AutoCompleteTextView de "startsWith" a "Contains"?
  • Android: AutoCompleteTextView margen superior en ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.