Android Custom ArrayAdapter no se actualiza después del filtro

Así que tengo un ArrayAdapter personalizado para poder usar la vista Título / Subtítulo que está disponible en el ListView . Tengo un EditText que acepta una cadena y filtra el adaptador.

El filtro funciona en el sentido de que está filtrando los objetos correctos (puedo decir haciendo clic en él y comienza la intención con los "extras" correctos.)

Sin embargo, aunque el filtrado funciona, los elementos del adaptador no se actualizan para mostrar la información correcta … El título y el subtítulo son incorrectos.

Digamos que tenemos los elementos de 0 a 9 en el ListView , filtrar a 3 elementos con una búsqueda, y permite decir que los elementos filtrados son 5, 6, 9 … 3 elementos se muestran, pero sus los primeros 3 elementos de la original Pre-search ListView (0-2). Si hago clic en el ítem 2 (el tercer ítem), el contenido de 9 está contenido en la nueva intención. Esto es correcto para los criterios de búsqueda, sin embargo, el título refleja la información correcta.

No estoy seguro de lo que necesito decirle al ListView para actualizarlo. No creo que su notifyDataSetChanged();

Cualquier ayuda es apreciada. ¡Gracias!

  public class myListAdapter extends ArrayAdapter<Pizza>{ private ArrayList<Pizza> items; private PizzaViewHolder myListHolder; private class PizzaViewHolder{ TextView title; TextView subtitle; } public myListAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) { super(context, textViewResourceId, items); this.items = items; // TODO Auto-generated constructor stub } @Override public View getView(int pos, View convertView, ViewGroup parent){ View v = convertView; if(v == null){ LayoutInflater vi = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.myList_item, null); myListHolder = new PizzaViewHolder(); myListHolder.title = (TextView)v.findViewById(R.id.title); myListHolder.subtitle = (TextView)v.findViewById(R.id.subtitle); v.setTag(myListHolder); }else myListHolder = (PizzaViewHolder)v.getTag(); Pizza myList = items.get(pos); if (myList != null){ myListHolder.title.setText(myList.getTitle()); myListHolder.subtitle.setText(myList.getSubTitle()); } return v; } } 

Esta es la búsqueda

  private TextWatcher filterTextWatcher = new TextWatcher(){ public void afterTextChanged(Editable s) { // TODO Auto-generated method stub if(!s.equals("")){ ((Filterable) this.listView1.getAdapter()).getFilter().filter(s); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } }; 

De lo que he determinado, parece que necesitaba un filtro personalizado para mi ArrayAdapter personalizado. El ArrayAdapter personalizado tiene una implementación sobrescrita de Filter, aquí está el código:

 import java.util.ArrayList; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.TextView; public class PizzaAdapter extends ArrayAdapter<Pizza>{ private ArrayList<Pizza> original; private ArrayList<Pizza> fitems; private Filter filter; public PizzaAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) { super(context, textViewResourceId, items); this.original = new ArrayList<Pizza>(items); this.fitems = new ArrayList<Pizza>(items); this.filter = new PizzaFilter(); } @Override public View getView(int position, View convertView, ViewGroup parent){ View v = convertView; if(v == null){ LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.pizza_list_item, null); } Pizza pizza = fitems.get(position); if(pizza != null){ String subtitleString = new String("[" + pizza.getPizzaType() + "] " + pizza.getPizzaCategory() + ": " + pizza.getPizzaCode()); TextView title = (TextView)v.findViewById(R.id.title); TextView subtitle = (TextView)v.findViewById(R.id.subtitle); if(title != null){ title.setText(pizza.getPizzaName()); } if(subtitle != null){ subtitle.setText(subtitleString); } } return v; } @Override public Filter getFilter(){ if(filter == null){ filter = new PizzaFilter(); } return filter; } private class PizzaFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence constraint){ FilterResults results = new FilterResults(); String prefix = constraint.toString().toLowerCase(); if (prefix == null || prefix.length() == 0){ ArrayList<Pizza> list = new ArrayList<Pizza>(original); results.values = list; results.count = list.size(); }else{ final ArrayList<Pizza> list = new ArrayList<Pizza>(original); final ArrayList<Pizza> nlist = new ArrayList<Pizza>(); int count = list.size(); for (int i = 0; i<count; i++){ final Pizza pizza = list.get(i); final String value = Pizza.getPizzaName().toLowerCase(); if(value.contains(prefix)){ nlist.add(pizza); } results.values = nlist; results.count = nlist.size(); } } return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { fitems = (ArrayList<Pizza>)results.values; notifyDataSetChanged(); clear(); int count = fitems.size(); for(int i = 0; i<count; i++){ add(fitems.get(i)); notifyDataSetInvalidated(); } } } } 

Resulta que una implantación personalizada de Filter actualizó la pantalla cuando se buscó. Espero que esto ayude a algunas personas.

  • EditText en un adaptador de lista, cómo guardar el valor?
  • Getview parámetro "convertview" no nulo en el nuevo parámetro "posición"
  • Cómo manejar onCheckedChangeListener para un RadioGroup en un adaptador ListView personalizado
  • Android - eliminar el elemento de ListView en un clic largo
  • Mostrar HTML con formato de cadena
  • La actividad se bloquea en setAdapter (ArrayAdapter);
  • Miniatura de video arrayadopter es lento en scroll
  • GridView no actualiza sus vistas secundarias después de que el adaptador obtiene nuevos elementos
  • ¿Cómo funciona el método getView () al crear su propio adaptador personalizado?
  • AlertDialog de opción múltiple con el adaptador de encargo
  • No es posible establecer SwipeFlingAdapterView desde el adaptador de matriz
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.