【问题标题】:No results when using a custom ArrayAdapter and Filter使用自定义 ArrayAdapter 和 Filter 时没有结果
【发布时间】:2013-02-20 00:50:30
【问题描述】:

我有一个自定义的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;
        }       

我像这样从ListFragment 更新我的ArrayAdapter

private void setListaUtenti(){

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

    } else{
        adapter.notifyDataSetChanged();         
    }                       
}

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

【问题讨论】:

  • 当您输入一些过滤后的文本时,您没有看到过滤后的值(或根本没有任何变化)?
  • 我可以进入 onQueryTextSubmit 但没有过滤元素..

标签: android filtering android-arrayadapter


【解决方案1】:

我有一个搜索视图,我想按名称过滤行,但我没有 结果。

FilterpublishResults() 回调中没有得到结果是正常的,您将结果分配给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();
}

【讨论】:

  • 我试过没有改变:adapter.getFilter().filter(query); setListaUtenti();但我还没有结果..
  • @fabio 如果你在publishResults() 方法中做clear(); utentiFiltrati = (ArrayList&lt;Utente&gt;)results.values; for (Utente item : utentiFiltrati) { add(item);} 怎么样?
  • 是的,现在我有结果了! (但这是错误的..)我怎么能在搜索之前回来?
  • @fabio but it is wrong 到底是什么意思? 在搜索之前返回 - 您是否尝试显示未过滤的列表(在这种情况下,您可以使用null 字符串再次过滤列表)?
  • 我解决了我的问题(在 getview 我必须使用数组过滤)谢谢 Luksprog!
猜你喜欢
  • 2012-01-26
  • 2012-01-05
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多