у меня есть обычай ArrayAdapter
как в этом коде:Нет результатов при использовании пользовательского ArrayAdapter Фильтры
public class UtenteAdapter extends ArrayAdapter<Utente> implements Filterable {
private Context context;
private ArrayList<Utente> utenti;
private ArrayList<Utente> utentiFiltrati;
private FiltroPersonalizzato filtro;
public UtenteAdapter(Context context, ArrayList<Utente> utenti) {
super(context, R.layout.riga_utente, utenti);
this.context=context;
this.utenti=utenti;
utentiFiltrati = new ArrayList<Utente>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//omitted..
return riga;
}
@Override
public void notifyDataSetChanged(){
super.notifyDataSetChanged();
}
@Override
public Filter getFilter() {
if (filtro == null) {
filtro = new FiltroPersonalizzato();
}
return filtro;
}
private class FiltroPersonalizzato extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults risultato = new FilterResults();
ArrayList<Utente> i = new ArrayList<Utente>();
if (prefix!= null && prefix.toString().length() > 0) {
// use the initial values !!!
for (int index = 0; index < utenti.size(); index++) {
Utente si = utenti.get(index);
final int length = prefix.length();
// if you compare the Strings like you did it will never work as you compare the full item string(you'll have a match only when you write the EXACT word)
// keep in mind that you take in consideration capital letters!
if(si.getNome().toLowerCase().substring(0, length).compareTo(prefix.toString().toLowerCase()) == 0){
i.add(si);
}
}
risultato.values = i;
risultato.count = i.size();
}
else{
// revert to the old values
synchronized (utentiFiltrati){
risultato.values = utenti;
risultato.count = utenti.size();
}
}
return risultato;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
utentiFiltrati = (ArrayList<Utente>)results.values;
notifyDataSetChanged();
}
}
}
У меня есть SearchView
, и я хочу, чтобы отфильтровать строки по имени, но у меня нет никаких результатов после фильтрации. Я уверен, что у меня есть результаты (от отладки), но если я вызываю фильтр из моего ListFragment
я не могу видеть мой результат:
@Override
public boolean onQueryTextSubmit(String query) {
adapter.getFilter().filter(query);
return true;
}
я обновляю мой ArrayAdapter
из ListFragment
, как это:
private void setListaUtenti(){
if(getListAdapter()==null){
// creo l'adapter
adapter=new UtenteAdapter(
getActivity(),
utenti);
setListAdapter(adapter);
} else{
adapter.notifyDataSetChanged();
}
}
Почему я не вижу результаты операции фильтрации?
Вы не видите отфильтрованные значения (или любые изменения вообще) при вводе отфильтрованного текста? – Luksprog
Я могу войти в onQueryTextSubmit, но ни один элемент не фильтруется. – fabio