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; } }