2011-05-19 26 views
5

he estado tirando de mi cabello durante unos días, estoy tratando de configurar una vista autocompletar en Android donde el usuario ingresa una clave y las sugerencias de autocompletar son los valores, sin embargo, he intentado esto de 10 maneras diferentes ahora , extendiendo BaseAdapter, SimpleAdapter y ahora ArrayAdapter, y he notado a través del depurador que mi conjunto de resultados está bien, sin embargo, realmente no tengo idea de lo que se supone que debo hacer en la sección publishResults() del código. El primer argumento es la costumbre de control AutoCompleteTextView usando el siguiente código XML:reemplazando resultados de filtro en android autocompletetextview?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
     <TextView android:id="@+id/txtInnerView2" android:layout_width="fill_parent" 
      android:layout_height="wrap_content"> 
     </TextView> 
</LinearLayout> 

y la clase es el siguiente:

public class NewArrayAdapter<T> extends ArrayAdapter implements Filterable { 
    ArrayList<String> allWords; 
    ArrayList<String> resultWords; 
    String value[] = { "Awesome", "Bear", "Cat", "Dog" }; 
    String key[] = { "A", "B", "C", "D" }; 

    public NewArrayAdapter(Context context, int resource, int textViewResourceId) { 
     super(context, resource, textViewResourceId); 
     // TODO Auto-generated constructor stub 
     allWords = new ArrayList<String>(); 
     resultWords = new ArrayList<String>(); 
    } 

    @Override 
    public Filter getFilter() { 
     Filter custom_filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults f = new FilterResults(); 
       if (constraint != null) { 
        ArrayList<String> lstResults = new ArrayList<String>(); 
        for (int x = 0; x < key.length; x++) { 
         if (key[x].startsWith(constraint.toString().toUpperCase())) { 
          lstResults.add(value[x]); 
         } 
        } 
        f.values = lstResults; 
        f.count = lstResults.size(); 
       } 
       return f; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       resultWords.clear(); 
       if (results.count > 0) { 
        resultWords.addAll((Collection<? extends String>) results.values); 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } 
     }; 
     return custom_filter; 
    } 
} 

int el constructor, NewArrayAdapter pública (contexto Contexto, recursos, int textViewResourceId, Objetos de lista) el segundo argumento es la vista autocompletetext, el tercero es el TextView anidado, y el 4to es una referencia a la lista que solo puedo suponer es lo que eventualmente debería ser el resultado, pero aparentemente no es ... esto es volviendo loco, ¿alguien tiene alguna sugerencia? Mi problema principal es que los resultados deben basarse en la clave, no en el valor, p. escribir "a" podría significar un resultado de "tiddlywinks" por lo que estoy tratando de hacer aquí cualquier información sería genial, muchas gracias

Respuesta

2

En primer lugar, configure textwatcher para editar el texto. como urEditText.addTextChangedListener (searchInputTextWatcher);

private TextWatcher searchInputTextWatcher = new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence sequence, int start, int before, 
      int count) { 
     //Log.i("View adapter count",String.valueOf(locationViewAdapter.getCount())); 
     //if (locationViewAdapter.getCount()>1) 
      someAdapter.filterList(sequence); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
      int arg3) { 
    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 
}; 

donde someAdapter es un adaptador donde u implementar el método filterlist (tipo de palabra en el campo de búsqueda)

public void filterArrayList(CharSequence sequence) { 
    if (TextUtils.isEmpty(sequence)) { 
     someArrayList = (ArrayList<type>) cloneCategoryArrayList 
       .clone(); 

    } else { 
     someArrayList = (ArrayList<type>) cloneCategoryArrayList 
       .clone(); 
     if (!TextUtils.isEmpty(sequence)) { 

      List<type> tempCategoryArrayList = new ArrayList<type>(
        someArrayList); 
      for (type obj : tempCategoryArrayList) { 
       String typeName = obj.name; 

       if (!typename.toLowerCase().startsWith(
         sequence.toString().toLowerCase(), 0)) 
        somearrayList.remove(type); 
      } 
     } 
    } 
    notifyDataSetChanged(); 
} 
+0

Sé que esto es de dos años, pero la función debe ser llamada para que coincida con filterlist someAdapter.filterList (secuencia); – Mike

Cuestiones relacionadas