2013-03-05 48 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; 
     }  

更新我ArrayAdapterListFragment这样的:

private void setListaUtenti(){ 

    if(getListAdapter()==null){ 
     // creo l'adapter 
     adapter=new UtenteAdapter(
       getActivity(), 
       utenti); 
     setListAdapter(adapter); 

    } else{ 
     adapter.notifyDataSetChanged();   
    }      
} 

为什么我没有看到过滤操作的结果?

+0

当您输入一些过滤的文本时,您看不到过滤的值(或任何更改)? – Luksprog 2013-03-05 15:10:23

+0

我可以进入onQueryTextSubmit但没有元素过滤.. – fabio 2013-03-05 15:20:50

回答

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 2013-03-05 17:13:31

+0

@fabio如果你做'clear(); utentiFiltrati =(ArrayList )results.values; for(Utente item:utentiFiltrati){add(item);}'在'publishResults()'方法中? – Luksprog 2013-03-05 17:56:29

+0

是的,现在我有一个结果! (但它是错误的..)我怎么能回来之前搜索? – fabio 2013-03-05 18:16:35

相关问题