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.
- Android: AutoCompleteTextView muestra sugerencias cuando no se introduce ningún texto
- SearchManager: agregar sugerencias personalizadas
- Android AutoCompleteTextView sugiere alternativa
- Anulando filterresults en android autocompletetextview?
- AutoCompleteTextView no muestra sugerencias en Android 2.3.5
Hecho hasta ahora:
- Autocompletar funciona bien para
ArrayList
simple, todos los datos filtrados correctamente -
onItemClick
eventoonItemClick
seonItemClick
correctamente después de hacer clic -
parent.getItemAtPosition(position)
devuelve la representación correcta deString
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
oCollections
enAutoCompleteTextView
- Cómo obtener el
itemId
correcto en el eventoonItemClick
Hice una investigación muy extensa sobre este tema, pero no encontré ninguna información valiosa que pudiera responder a mis preguntas.
- Android: restringir al usuario para seleccionar sólo texto de autocompletado
- Android - vista de búsqueda con función completa automática dentro de la barra de acción
- Android AutoCompleteTextView con '@' menciona el filtrado como twitter y facebook
- Android AutoCompleteTextView con filtro de adaptador personalizado no funciona
- Mostrando resultados de autocompletetextview como sugerencias arriba del teclado
- Cómo filtrar los resultados de AutoCompleteTextView?
- AutoCompleteTextView no funciona cuando introdujo el primer carácter
- AutoCompleteTextView no completar palabras entre paréntesis
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(); } });
- ¿Cómo puede crear pantalla táctil android scroll en unity3d?
- Fuentes Eclipse Zoom out & Zoom in Issue