ListView пуст при использовании функции getFilter

Я пытаюсь реализовать функцию getFilter() в моем ListView но каждый раз, когда я ввожу что-то в EditText мой ListView исчезает.

Мой файл 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; } } 

Мой файл 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); } } } } 

Мой частичный файл 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 } }); 

В LogCat я вижу следующее:

 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 

Я изменил свой код и смог заставить его работать. Если кто-то хочет его использовать, будь моим гостем 🙂

Файл 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; } } 

Файл 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(); } } } 

Все остальное оставалось неизменным 🙂

Я надеюсь, что люди найдут это полезным для своего приложения.

Вам не нужно использовать собственный Filter , если вы используете ArrayAdapter вы можете просто переопределить метод toString в SetHelpRows чтобы вернуть имя. Затем вы можете вызвать встроенный Filter ArrayAdapter .

Это не прямой ответ на ваш вопрос, а скорее предложение изменить вашу реализацию.

попробуйте это в своей функции publishResults

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

в принятом ответе фильтр может быть улучшен путем переопределения getCount ()

 @override public int getCount(){ return data.size(); 
  • Android Studio JAR-файл, вызывающий превышение лимита GC overhead
  • Изменение цвета плавающей кнопки Android
  • Проверить навигационную панель
  • Почему в Android не работает «System.out.println»?
  • Зачем использовать Enums вместо констант?
  • Как изменить имя пакета приложения для Android
  • Не удается получить местоположение и электронную почту с помощью API Facebook
  • Транзитные зависимости не разрешены для aar-библиотеки с использованием gradle
  • Есть ли у java int.tryparse, который не генерирует исключение для плохих данных?
  • Как запустить Java-приложение с помощью файла .bat
  • Как проверить, существует ли class в пакете?
  • Давайте будем гением компьютера.