如果与过滤器不匹配,请勿添加项目

时间:2010-10-06 06:59:17

标签: android listview filter

        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,即使没有匹配。

我该如何解决这个问题?

提前致谢并告诉我这个问题是否不清楚!

1 个答案:

答案 0 :(得分:0)

根据您之前提出的问题,如果onProgressUpdate为空,您可以在EditText办理登机手续。如果它包含一些文本,那么在那时过滤它。

@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为空时显示所有订单。