2012-02-08 16 views
5

un problema que no puedo resolver.Android AutoCompleteTextView con datos de un servicio web, problemas al mostrar la lista de sugerencias

Lo que quiero lograr: Mostrar sugerencias en un AutoCompleteTextView procedente de una llamada al servicio web. El resultado final debería tener este aspecto:

enter image description here

Lo que hizo hasta ahora:

En mi diseño tengo una AutoCompleteTextView como esto

<AutoCompleteTextView 
      android:id="@+id/txtAutoSearch" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:selectAllOnFocus="true" 
      android:singleLine="true" /> 

En mi Actividad tengo esto:

autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????, null); 
     autoCompleteAdapter.setNotifyOnChange(true); 
     txtAutoSearch.setAdapter(autoCompleteAdapter); 
      txtAutoSearch.addTextChangedListener(new TextWatcher() { 

       private boolean shouldAutoComplete = true; 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
        shouldAutoComplete = true; 

       } 

       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        if (shouldAutoComplete) { 
         new GetAutoSuggestionsTask().execute(s.toString()); 
        } 
       } 

      }); 

El AsyncTask es bastante simple, onPostExecute puse el adaptador con los datos devueltos por el servicio web

autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????,result); 
txtAutoSearch.setAdapter(autoCompleteAdapter); 

El adaptador es el siguiente:

public class AdapterAutoComplete extends ArrayAdapter<Person> { 

    private Activity activity; 
    private List<Person> lstPersons; 
    private static LayoutInflater inflater = null; 

    public AdapterAutoComplete(Activity a, int textViewResourceId, List<Person> lst) { 
     super(a, textViewResourceId, lst); 
     activity = a; 
     lstPersons = lst; 
     inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return lstPersons.size(); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public Person getCurrentPerson(int position) { 
     return lstPersons.get(position); 
    } 

    public void removeItem(int position) { 
     lstPersons.remove(position); 
    } 

    public static class ViewHolder { 
     public TextView txtName; 
     public TextView txtProfession; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     ViewHolder holder; 
     if (convertView == null) { 
      vi = inflater.inflate(R.layout.people_list_item, null); 
      Utils.overrideFonts(activity, vi); 

      holder = new ViewHolder(); 
      holder.txtName = (TextView) vi.findViewById(R.id.txtName); 
      holder.txtProfession = (TextView) vi.findViewById(R.id.txtProfession); 

      vi.setTag(holder); 
     } else { 
      holder = (ViewHolder) vi.getTag(); 
     } 

     Person o = lstPersons.get(position); 

     if (o.name != null) { 
      holder.txtName.setText(o.name); 
     } else { 
      holder.txtName.setText("N/A"); 
     } 

     if (o.profession != null) { 
      holder.txtProfession.setText(o.profession); 
     } else { 
      holder.txtProfession.setText("N/A"); 
     } 
     return vi; 
    } 
} 

Lo real sucede:

  • el servicio web devuelve la lista que necesito, por lo que los datos están disponibles
  • en Adapter el getView no parece ejecutarse, así que supongo que hay algo mal hecho en él.
  • no hay una lista de sugerencias mostrada con mis valores
  • No tengo idea de lo que necesito para el constructor del adaptador, para textViewResourceId. ¿Qué estoy haciendo mal? Estoy atascado por favor ayuda.

Respuesta

-7

De hecho, al final opté por this route y en runQueryOnBackground acabo de hacer una llamada a mi servicio web y crear un Cursor de matriz con los campos necesarios. Lo sé ... no es la mejor solución, pero funciona en mi caso.

7

Después de un escaneo rápido de la documentación, parece que está en el camino correcto.

Necesita tener su solicitud asíncrona para obtener una lista de resultados de una fuente externa. El autocompletado debe volver a verificarse con cada pulsación de tecla (cancelando la solicitud anterior de datos), esto se debe activar usando addTextChangedListener, que es lo que está haciendo. Hasta aquí todo bien.

De esta lista de resultados debe construir y completar un Adaptador: Su adaptador personalizado debe extender el ListAdapter & Filterable (como se describe en la documentación setAdapter()).

Una vez que tenga un adaptador que debería ser tan simple como llamar:

// AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list); 
textView.setAdapter(adapter); 

Recuerde que cualquier cambio de interfaz de usuario se deben hacer en el hilo de interfaz de usuario o mediante un Handler.

getView() debe ser llamado cuando el adaptador tiene:

  • cambió con setAdapter()
  • .notifyDataSetChanged() ha sido llamado en el ListView.

Si los dos eventos anteriores no causan nueva getView() s.You debe garantizar los métodos getCount() y getItem() regresan los valores correctos.

Cuestiones relacionadas