2010-10-06 56 views
0
 private class NameFilter extends Filter 
    { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      constraint = constraint.toString().toLowerCase(); 
      FilterResults result = new FilterResults(); 
      if(constraint != null && constraint.toString().length() > 0) 
      { 
       ArrayList<Order> filt = new ArrayList<Order>(); 
       ArrayList<Order> lItems = new ArrayList<Order>(); 
       synchronized (this) 
       { 
        lItems.addAll(items); 
       } 
       for(int i = 0, l = lItems.size(); i < l; i++) 
       { 
        Order m = lItems.get(i); 
        if(m.getOrderTitle().toLowerCase().contains(constraint) 
          || m.getOrderTime().toLowerCase().contains(constraint) || 
          m.getOrderPrice().toLowerCase().contains(constraint)) 
         filt.add(m);      
       } 
       result.count = filt.size(); 
       result.values = filt; 

      } 
      else 
      { 
       synchronized(this) 
       { 
        result.values = items; 
        result.count = items.size(); 
       } 
      } 
      return result; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

      filtered = (ArrayList<Order>)results.values; 
      adapter.notifyDataSetChanged(); 
      adapter.clear(); 
      if(!constraint.equals("")){ 
      for(int i = 0; i < filtered.size(); i++){ 
       adapter.add(filtered.get(i)); 
       adapter.setId(i, filtered.get(i).getOrderId()); 
      } 
      } 

      else { 
       if(orders!=null){ 
       for(int i = 0; i < orders.size(); i++){ 
       adapter.add(orders.get(i)); 
       adapter.setId(i, orders.get(i).getOrderId()); 
       } 
       } 
      } 

     } 

    } 

ListView中的项来自AsyncTask。当AsyncTask正在运行时,我希望它停止添加不匹配的项目。现在,如果它已经加载了5个项目,并且我使用指定的String进行搜索,那么当AsyncTask继续加载项目时,它会自动将Orders添加到ListView,即使没有匹配。如果与过滤器不匹配,则不要添加项目

我该如何解决这个问题?

在此先感谢,并告诉我,如果问题不清楚!

回答

0

根据您此前关于SO的问题,如果您的EditText为空,您可以在onProgressUpdate中检查。如果它包含一些文本,那么在该点进行过滤。

@Override 
protected void onProgressUpdate(Integer... i) { 

    CharSequence cs = yourEditText.getText().toString(); //Get text 
    if(!cs.equals("")){ //Check if "cs" contains text 
     adapter.add(orders.get(i[0])); //Add it to the adapter, then...  
     adapter.getFilter().filter(cs); //..do your filtering, and... 
     adapter.notifyDataSetChanged(); //...update your View 
    } 
    else { //Otherwise, just add the order to your adapter.. 
     adapter.add(orders.get(i[0])); 
    } 

} 

我们随时添加所有订单(即使EditText包含的信息),以确保所有订单显示当EditText是空的。

+0

谢谢!这很有用! – Curtain 2010-10-06 08:22:08

相关问题