2011-05-20 14 views
10

Estoy trabajando en una vista autocompleta que funcionará con un sistema de valores clave, y estoy tratando de averiguar qué debo hacer para que funcione publishResults, ya que el parámetro de resultados que se pasa a publishResults aquí es correcto en el depurador, sin embargo, no tengo idea de a qué debe corresponder o cómo hacer que muestre los resultados, ¿alguien puede ayudar? la creación de este objeto se encuentra en otro archivo, y se ve así:¿Cómo uso el método publishResults() cuando extiendo filtros en Android?

autoCompleteBox.setAdapter(new AutoCmpAdapter(this, android.R.layout.simple_dropdown_item_1line)); 

y el resto del código es el siguiente:

public class AutoCmpAdapter extends ArrayAdapter<String> implements Filterable { 

    protected Filter filter; 
    protected ArrayList<String> items; 
    protected ArrayList<String> res; 
    String lWds[] = { "HOMER", "TOM" }; 
    String sWds[] = { "SIMPSON", "JONES" }; 

    public AutoCmpAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
     filter = new PhysFilter(); 
     res = new ArrayList<String>(); 
    } 

    public Filter getFilter() { 
     return filter; 
    } 

    private class PhysFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults f = new FilterResults(); 
      res.clear(); 
      if (constraint != null) { 
       ArrayList<String> res = new ArrayList<String>(); 
       for (int x = 0; x < sWds.length; x++) { 
        if (sWds[x].toUpperCase().startsWith(constraint.toString().toUpperCase())) { 
         res.add(lWds[x]); 
        } 
       } 
       f.values = res.toArray(); 
       f.count = res.size(); 
      } 
      return f; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      if (results.count > 0) { 
       Log.println(Log.INFO, "Results", "FOUND"); 
       notifyDataSetChanged(); 
      } else { 
       Log.println(Log.INFO, "Results", "-"); 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
} 

Respuesta

10

En primer lugar no usar una matriz de cadena.

a trabajar por un par de valores clave que puede ajustar su instrucción If .. probar esto en su onCreate

AutoCompleteTextView mAutoCompleteTextView; 
ArrayList<String> lWds = new ArrayList<String>(); 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mAutoCompleteTextView=(AutoCompleteTextView)findViewById(R.id.testAutoComplete); 


    final AutoCmpAdapter adapter= new AutoCmpAdapter(this, android.R.layout.simple_dropdown_item_1line,lWds); 
    mAutoCompleteTextView.setAdapter(adapter); 
    mAutoCompleteTextView.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      adapter.getFilter().filter(s); 

     } 
    }); 
} 

y el adaptador de clase como

public class AutoCmpAdapter extends ArrayAdapter<String> implements Filterable { 

    protected Filter filter; 
    protected ArrayList<String> items; 
    protected ArrayList<String> res; 

    String sWds[] = { "SIMPSON", "JONES" }; 

    public AutoCmpAdapter(Context context, int textViewResourceId,ArrayList<String> listData) { 
     super(context, textViewResourceId,0,listData); 

     filter = new PhysFilter(); 
     res = new ArrayList<String>(); 
    } 

    public Filter getFilter() { 
     return filter; 
    } 

    private class PhysFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults f = new FilterResults(); 
      res.clear(); 
      if (constraint != null) { 
       ArrayList<String> res = new ArrayList<String>(); 
       for (int x = 0; x < sWds.length; x++) { 
        if (sWds[x].toUpperCase().contains(constraint.toString().toUpperCase())) { 
         res.add(sWds[x]); 
        } 
       } 
       f.values = res;//.toArray(); 
       f.count = res.size(); 
      } 
      return f; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      if (results.count > 0) { 
       Log.println(Log.INFO, "Results", "FOUND"); 
       lWds.clear(); 
       lWds.addAll((ArrayList<String>) results.values); 
       notifyDataSetChanged(); 
      } else { 
       Log.println(Log.INFO, "Results", "-"); 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
} 
+0

+1 solución de Niza. –

+4

¿de dónde viene lWds en publishResults? –

+0

@artworkad シ del dedo índice derecho pensando que es el dedo índice izquierdo ?? Haha .. es del código OP – whyoz

Cuestiones relacionadas