2012-07-17 21 views
5

Soy nuevo en el desarrollo de Android y me encontré con un problema que me parece difícil de resolver. Estoy intentando descubrir cómo usar un widget AutoCompleteTextView correctamente. Quiero crear un AutoCompleteTextView, usando datos XML de un servicio web. Me las arreglé para que funcione, pero definitivamente no estoy satisfecho con la salida.Cómo llegar correcta identificación del adaptador de AutoCompleteTextView

Me gustaría poner un HashMap con id => pares de nombres en el AutoCompleteTextView y obtener el id del elemento cliqueado. Cuando hago clic en el autocompletar filtrada de salida ajustado, quiero rellenar una lista debajo de la caja de autocompletar, que también me las arreglé para llegar al trabajo.

hecho hasta ahora:

  • autocompletar funciona bien para la sencilla ArrayList, todos los datos filtrados correcta
  • onItemClick desencadena el evento correctamente después clic
  • parent.getItemAtPosition(position) vuelve correcta String representación del artículo que se hace clic

La víspera nt onItemClick(AdapterView parent, View v, int position, long id) no se comporta como me gustaría. ¿Cómo puedo averiguar la posición de la matriz no filtrada del elemento cliqueado? La posición de la que se filtra es el que yo no estoy interesado en

preguntas adicionales:.

  • Cómo manejar HashMaps o Collections en AutoCompleteTextView
  • Cómo obtener el derecho itemId en el onItemClick caso

me fue muy extensa investigación sobre este tema, pero no encontró ninguna información valiosa que responder a mis preguntas.

+0

PLS ayudar a amigos – sarath

+0

amigo Hai, he tratado de resolver esto, pero no pude ... wonder.Why no hay soluciones de los tigres android ??? –

Respuesta

13

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

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

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

esto funcionará para las listas y Maps (suponiendo que se utiliza el SimpleAdapter). Y por un Maps que siempre tiene la opción de añadir una clave adicional para establecer la posición sin filtrar en la lista inicial.

Si utiliza su propio adaptador junto con AutoCompleteTextView, puede hacer que onItemClick() le proporcione el derecho id (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 implementar la clase Filter para el adaptador entonces se podría obtener los identificadores de allí sin la necesidad de sustituir la clase de AutoCompleTextView.

1

Usando el enfoque 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; 
     } 

    } 
2

Implementar onItemClickListener para AutoCompleteTextView, a continuación, utilizar 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 ;) 
    } 
}); 
0

En primer lugar poner sus datos en ArrayList encargo

// 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 conseguir cualquier valor de modelo que hemos añadido anteriormente. podemos obtener así

searchOutletKey.setOnItemClickListener (new AdapterView.OnItemClickListener () { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String txtOutletId = mOutletListSRModel.get(position).getId(); 
      } 
     }); 
Cuestiones relacionadas