ListView está en blanco al usar la función getFilter

Estoy intentando implementar la función getFilter() en mi ListView pero cada vez que introduzco algo en EditText mi ListView desaparece.

Mi archivo SetHelpRows :

 public class SetHelpRows { String name; String id; public String getName () { return name; } public void setName (String name) { this.name = name; } public String getID () { return id; } public void setID (String id) { this.id = id; } public SetHelpRows(String name, String id) { super(); this.name = name; this.id = id; } } 

Mi archivo SetHelpRowsCustomAdapter :

 import java.util.ArrayList; import android.app.Activity; 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.ImageView; import android.widget.TextView; public class SetRowsCustomAdapter extends ArrayAdapter { Context context; int layoutResourceId; ArrayList data=new ArrayList(); private ArrayList original; private ArrayList fitems; private Filter filter; public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; this.original = data;//new ArrayList(); this.fitems = data;//new ArrayList(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ImageHolder holder = null; if(row == null) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new ImageHolder(); holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); holder.txtID = (TextView)row.findViewById(R.id.txtModDate); row.setTag(holder); } else { holder = (ImageHolder)row.getTag(); } SetRows myImage = data.get(position); holder.txtTitle.setText(myImage.name); holder.txtID.setText(myImage.id); int outImage=myImage.image; holder.imgIcon.setImageResource(outImage); return row; } static class ImageHolder { ImageView imgIcon; TextView txtTitle; TextView txtID; } @Override public Filter getFilter() { if (filter == null) { Log.i("Before Filter", "Before Filter"); filter = new PkmnNameFilter(); } return filter; } private class PkmnNameFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); String prefix = constraint.toString().toLowerCase(); if (prefix == null || prefix.length() == 0) { Log.i("prefix is null or 0", "prefix is null or 0"); ArrayList list = new ArrayList(original); results.values = list; results.count = list.size(); } else { Log.i("prefix is !null or !0", "prefix is !null or !0"); final ArrayList list = new ArrayList(original); final ArrayList nlist = new ArrayList(); int count = list.size(); for (int i=0; i<count; i++) { final SetRows pkmn = list.get(i); final String value = pkmn.getName().toLowerCase(); if (value.startsWith(prefix)) { nlist.add(pkmn); } } results.values = nlist; results.count = nlist.size(); } return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { Log.i("publish result", "publish result"); fitems = (ArrayList)results.values; clear(); int count = fitems.size(); for (int i=0; i<count; i++) { SetRows pkmn = (SetRows)fitems.get(i); add(pkmn); } } } } 

Mi archivo parcial de MainActivity :

 inputSearch = (EditText) findViewById(R.id.etSearch); dataList = (ListView) findViewById(R.id.lvFiles); for (int y=0; y<strNames.length;y++) { name = strNamesOfAllah[y]; meaning = strMeaning[y]; rowsArray.add(new SetRows(R.drawable.icon, name, meaning)); } adapter = new SetRowsCustomAdapter(MainActivity.this, R.layout.customlist, rowsArray); dataList.setAdapter(adapter); dataList.setClickable(true); inputSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text //MainActivity.this.adapter.getFilter().filter(cs); //String text = inputSearch.getText().toString().toLowerCase(); adapter.getFilter().filter(cs.toString().toLowerCase(Locale.US)); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { //TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { //TODO Auto-generated method stub } }); 

En el LogCat , veo lo siguiente:

 12-12 12:15:57.077: I/Before Filter(720): Before Filter 12-12 12:15:57.106: I/prefix is !null or !0(720): prefix is !null or !0 12-12 12:15:57.216: I/publish result(720): publish result 

Modifiqué mi código y pude hacerlo funcionar. Si alguien quiere usarlo, sea mi invitado 🙂

Archivo SetRows Java:

 public class SetRows { int image; String name; String id; public int getImage () { return image; } public void setImage (int image) { this.image = image; } public String getName () { return name; } public void setName (String name) { this.name = name; } public String getID () { return id; } public void setID (String id) { this.id = id; } public SetRows(int image, String name, String id) { super(); this.image = image; this.name = name; this.id = id; } @Override public String toString() { return image + " " + name + " " + id; } } 

Archivo Java SetRowsCustomAdapter:

 import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.ImageView; import android.widget.TextView; public class SetRowsCustomAdapter extends ArrayAdapter { Context context; int layoutResourceId; ArrayList data=new ArrayList(); //data = countryList private ArrayList originalList; private NameFilter filter; public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; //this.data.addAll(data); this.originalList = new ArrayList(); this.originalList.addAll(data); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ImageHolder holder = null; if(row == null) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new ImageHolder(); holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); holder.txtID = (TextView)row.findViewById(R.id.txtModDate); row.setTag(holder); } else { holder = (ImageHolder)row.getTag(); } SetRows myImage = data.get(position); holder.txtTitle.setText(myImage.name); holder.txtID.setText(myImage.id); int outImage=myImage.image; holder.imgIcon.setImageResource(outImage); return row; } static class ImageHolder { ImageView imgIcon; TextView txtTitle; TextView txtID; } @Override public Filter getFilter() { if (filter == null){ filter = new NameFilter(); } return filter; } private class NameFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { constraint = constraint.toString().toLowerCase(); FilterResults result = new FilterResults(); if(constraint != null && constraint.toString().length() > 0) { ArrayList filteredItems = new ArrayList(); for(int i = 0, l = originalList.size(); i < l; i++) { SetRows nameList = originalList.get(i); if(nameList.toString().toLowerCase().contains(constraint)) filteredItems.add(nameList); } result.count = filteredItems.size(); result.values = filteredItems; } else { synchronized(this) { result.values = originalList; result.count = originalList.size(); } } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { data = (ArrayList)results.values; notifyDataSetChanged(); clear(); for(int i = 0, l = data.size(); i < l; i++) add(data.get(i)); notifyDataSetInvalidated(); } } } 

Todo lo demás se mantuvo igual 🙂

Espero que las personas lo encuentren útil para su propia aplicación.

No necesita implementar su propio Filter , si está utilizando un ArrayAdapter , puede anular el método toString en SetHelpRows para devolver el nombre. Luego puede llamar al ArrayAdapter incorporado de ArrayAdapter .

Esta no es una respuesta directa a su pregunta, sino una sugerencia para cambiar su implementación.

por favor intente esto en su función publishResults

  @Override protected void publishResults(CharSequence constraint, FilterResults results) { Log.i("publish result", "publish result"); data = (ArrayList)results.values; notifyDataSetChanged(); } 

en la respuesta aceptada, el filtro se puede mejorar anulando getCount ()

 @override public int getCount(){ return data.size();