I can not understand with filtering in ListView. Filtering happens correctly (finds the right amount), but displays not the ones you need (for example, not 1, 3, and 5), but the first ones from the list (1-3).

MainActivity:

private EditText etSearch; // Π‘Ρ‚Ρ€ΠΎΠΊΠ° для поиска private List<Passenger> list; // лист ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² private List<Passenger> allPassenger; // Π±ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ лист для всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² private ListView lv; //ListView private ArrayAdapter<Passenger> adapter; // Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ ... etSearch = (EditText)findViewById(R.id.etSearch); // инициализация массивов элСмСнтов list = new ArrayList<>(); lv = (ListView)findViewById(R.id.lvPassengers); adapter = new PassengerAdapter(this); ... // Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ массивов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ list.add(new Passenger(id, surname, numberCar, typeCar, positionTypeCar, terminal, positionTerminals, date)); allPassenger = new ArrayList<>(list); // Π²Ρ‹Π²ΠΎΠ΄ колличСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² tvAll.setText(String.valueOf(adapter.getCount())); lv.setAdapter(adapter); // поиск Ρ‡Π΅Ρ€Π΅Π· EditText etSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { adapter.getFilter().filter(cs); } @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 } }); 

Passenger class:

 public class Passenger { public final int id; public final String surname; public final String numberCar; public final String typeCar; public final int positionTypeCar; public final String terminal; public final int positionTerminal; public final String date; public Passenger(int id, String surname, String numberCar, String typeCar, int positionTypeCar, String terminal, int positionTerminal, String date) { this.id = id; this.surname = surname; this.numberCar = numberCar; this.typeCar = typeCar; this.positionTypeCar = positionTypeCar; this.terminal = terminal; this.positionTerminal = positionTerminal; this.date = date; } } 

Adapter and filter:

 private class PassengerAdapter extends ArrayAdapter<Passenger> implements Filterable { public PassengerAdapter(Context context) { super(context, R.layout.list_item, list); } @Override public int getCount (){ return list.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { Passenger passenger = getItem(position); if (convertView == null) { convertView = LayoutInflater.from(getContext()) .inflate(R.layout.list_item, null); } ((TextView) convertView.findViewById(R.id.surname)) .setText(passenger.surname); ((TextView) convertView.findViewById(R.id.numberCar)) .setText(passenger.numberCar); ((TextView) convertView.findViewById(R.id.typeCar)) .setText(passenger.typeCar); ((TextView) convertView.findViewById(R.id.date)) .setText(passenger.date); ((TextView) convertView.findViewById(R.id.terminal)) .setText(passenger.terminal); return convertView; } @Override public Filter getFilter() { Filter filter = new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults result = new FilterResults(); if(constraint == null || constraint.length() == 0){ result.values = allPassenger; result.count = allPassenger.size(); } else{ ArrayList<Passenger> filteredList = new ArrayList<>(); for(Passenger p: allPassenger){ if(p.surname.toLowerCase().contains(constraint)) filteredList.add(p); //Π“Π΄Π΅ Ρ‚ΠΎ здСсь ошибка } result.values = filteredList; result.count = filteredList.size(); } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { list = (ArrayList<Passenger>) results.values; tvAll.setText(String.valueOf(results.count)); notifyDataSetChanged(); } }; return filter; } } 

    1 answer 1

    Found a mistake! As always, due to no care, I forgot to add the getItem() method to the adapter. Here is the corrected adapter:

      private class PassengerAdapter extends ArrayAdapter<Passenger> implements Filterable { public PassengerAdapter(Context context) { super(context, R.layout.list_item, list); } @Override public Passenger getItem(int position) { return list.get(position); } @Override public int getCount (){ return list.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getContext()) .inflate(R.layout.list_item, null); } Passenger passenger = getItem(position); ((TextView) convertView.findViewById(R.id.surname)) .setText(passenger.surname); ((TextView) convertView.findViewById(R.id.numberCar)) .setText(passenger.numberCar); ((TextView) convertView.findViewById(R.id.typeCar)) .setText(passenger.typeCar); ((TextView) convertView.findViewById(R.id.date)) .setText(passenger.date); ((TextView) convertView.findViewById(R.id.terminal)) .setText(passenger.terminal); return convertView; } @Override public Filter getFilter() { Filter filter = new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults result = new FilterResults(); if(constraint == null || constraint.length() == 0){ result.values = allPassenger; result.count = allPassenger.size(); } else{ ArrayList<Passenger> filteredList = new ArrayList<>(); for(Passenger p: allPassenger){ if(p.surname.toLowerCase().contains(constraint)) filteredList.add(p); } result.values = filteredList; result.count = filteredList.size(); } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { list = (ArrayList<Passenger>) results.values; tvAll.setText(String.valueOf(results.count)); notifyDataSetChanged(); } }; return filter; } }