2013-06-27 200 views
2

我有一個像下面這樣的適配器,並且我使用getFilter方法來篩選列表視圖中的數據。它可以工作,但過濾後,只有過濾的數據。我的意思是,例如,當我過濾usind「test1」關鍵字,那裏有test1,test12,test13 ...,當我刪除最後一個字「測試」 我期望過濾器再次加載整個數據。通過在適配器中使用getFilter()進行篩選,使用篩選數據填充列表

我該如何解決這個問題。

search.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      listAdapter.getFilter().filter(s); 
      Log.v("textchanged",s.toString()); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
     // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 

     } 
    }); 


private class BranchListAdapter extends ArrayAdapter<BranchViewModel>{ 

    private Context context; 
    private ArrayList<BranchViewModel> itemList; 
    private int layoutResources; 

    public BranchListAdapter(Context context, int textViewResourceId,ArrayList<BranchViewModel> objects) { 
     super(context, textViewResourceId, objects); 

     this.context = context; 
     this.itemList = objects; 
     this.layoutResources = textViewResourceId; 

    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null){ 
      convertView = LayoutInflater.from(this.context).inflate(this.layoutResources, null); 
     } 

     ATextView aTextView =(ATextView) convertView.findViewById(R.id.havalePaymentTypeItemText); 
     aTextView.setText(itemList.get(position).getBranchCode() +"-"+ itemList.get(position).getBranchName()); 

     return convertView; 

    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint,FilterResults results) { 
      Log.println(Log.INFO, "Results", "FOUND"); 
      itemList.clear(); 
      itemList.addAll((ArrayList<BranchViewModel>) results.values); 
      Log.e("VALUES","in publish : "+ String.valueOf(itemList.size())); 
      notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      ArrayList<BranchViewModel> FilteredBranchViewModel = new ArrayList<BranchViewModel>(); 

      constraint = constraint.toString().toLowerCase(); 

      for (int i = 0; i < itemList.size(); i++) { 
      String dataNames = itemList.get(i).getBranchName(); 
      String dataId = itemList.get(i).getBranchCode(); 

      if (dataNames.toLowerCase().startsWith(constraint.toString()) | dataId.toLowerCase().startsWith(constraint.toString())) { 
       FilteredBranchViewModel.add(itemList.get(i)); 
      } 
      } 

      results.count = FilteredBranchViewModel.size(); 
      results.values = FilteredBranchViewModel; 
      Log.e("VALUES","in filter : "+ String.valueOf(results.count)); 

      return results; 
     } 
     }; 

     return filter;  
    } 
+1

或許你應該保持原始數據集的副本 – Blackbelt

回答

1

檢查出ArrayAdapter.ArrayFilter的來源。您會看到他們在performFiltering(CharSequence)中複製了原始數據。

段:

if (mOriginalValues == null) { 
    synchronized (mLock) { 
     mOriginalValues = new ArrayList<T>(mObjects); 
    } 
} 

if (prefix == null || prefix.length() == 0) { 
    ArrayList<T> list; 
    synchronized (mLock) { 
     list = new ArrayList<T>(mOriginalValues); 
    } 
} 
results.values = list; 
results.count = list.size(); 
+0

http://stackoverflow.com/questions/2718202/custom-filtering-in-android-using-arrayadapter – Talha