2013-03-05 49 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

相關問題