2013-03-05 3 views
0

у меня есть обычай 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();   
    }      
} 

Почему я не вижу результаты операции фильтрации?

+0

Вы не видите отфильтрованные значения (или любые изменения вообще) при вводе отфильтрованного текста? – Luksprog

+0

Я могу войти в onQueryTextSubmit, но ни один элемент не фильтруется. – fabio

ответ

1

У меня есть поиск и я хочу, чтобы строка фильтра по имени, но у меня нет результат.

Это нормально, что вы не получите результат, как и в publishResults() обратного вызова из Filter присвоить результаты в utentiFiltrati списке и вызовите notifyDataSetChanged(). Это ничего не сделает, поскольку ваш адаптер основан на списке utenti, который вы передаете конструктору суперкласса. Внесите следующие изменения:

public UtenteAdapter(Context context, ArrayList<Utente> utentiValues) { 
    super(context, R.layout.riga_utente, utentiValues); 
    this.context=context; 
    this.utentiFiltrati = utentiValues; 
    utenti = new ArrayList<Utente>(utentiValues); 
} 

// ... 
FilterResults risultato = new FilterResults(); 
ArrayList<Utente> i; 
if (prefix == null || prefix.toString().length() == 0) { 
    // the contract of a Filter says that you must return all values if the 
    // challenge string is null or 0 length 
    i = new ArrayList<Utente>(utenti); 
} else { 
    i = new ArrayList<Utente>(); 
    // use the list that contains the full set of data 
    for (int index = 0; index < utenti.size(); index++) { 
      Utente si = utenti.get(index); 
      final int length = prefix.length(); 
      if(si.getNome().toLowerCase().substring(0, length).compareTo(prefix.toString().toLowerCase()) == 0){ 
       i.add(si); 
      } 
    } 
    //... 
@SuppressWarnings("unchecked") 
@Override 
protected void publishResults(CharSequence constraint, 
     FilterResults results) { 
    utentiFiltrati = (ArrayList<Utente>)results.values; 
    notifyDataSetChanged(); 
} 
+0

без изменений я попробовал: \t \t \t \t adapter.getFilter(). Filter (query); setListaUtenti(); но у меня пока нет результата. – fabio

+0

@fabio Как насчет того, если вы сделаете 'clear(); utentiFiltrati = (ArrayList ) results.values; для элемента Utente: utentiFiltrati) {add (item);} 'в методе' publishResults() '? – Luksprog

+0

да теперь у меня есть результат! (но это неправильно ..) как я могу вернуться до поиска? – fabio

Смежные вопросы