2014-04-01 33 views
0
public class SpotAdapter extends ArrayAdapter<Spot> { 

    private ArrayList<Spot> mFilteredList, mUnfilteredList; 
    private Filter mFilter; 

    public SpotAdapter(Context context, int resource, List<Spot> items) { 
     super(context, resource, items); 
     mUnfilteredList = (ArrayList<Spot>) items; 
     mFilteredList = (ArrayList<Spot>) items; 
    } 

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

     View v = convertView; 

     if (v == null) { 
      LayoutInflater vi; 
      vi = LayoutInflater.from(getContext()); 
      v = vi.inflate(R.layout.record_row, null); 
     } 

     Spot p = (Spot) mFilteredList.get(position); 

     if (p != null) { 
      TextView nameView = (TextView) v.findViewById(R.id.name); 
      TextView addressView = (TextView) v.findViewById(R.id.address); 
      TextView typeView = (TextView) v.findViewById(R.id.type); 
      TextView contactView = (TextView) v.findViewById(R.id.contact); 
      ImageView starBtn = (ImageView) v.findViewById(R.id.star); 

      contactView.setVisibility(View.GONE); 
      nameView.setText(p.name); 
      addressView.setText(p.address); 
      typeView.setText(p.type == 1 ? "Leisure" : "Shopping"); 
      starBtn.setTag("" + p.id); 
      starBtn.setVisibility(p.isStar ? View.VISIBLE : View.GONE); 
     } 

     return v; 

    } 

    @Override 
    public Filter getFilter() { 
     if(mFilter == null) { 
      mFilter = new Filter() { 

       @Override 
       protected void publishResults(CharSequence constraint, FilterResults results) { 
        mFilteredList = (ArrayList<Spot>)results.values; 
        clear(); 
        int count = mFilteredList.size(); 
        for (int i=0; i<count; i++) 
        { 
         Spot s = (Spot)mFilteredList.get(i); 
         add(s); 
        } 
//     
//     mFilteredList = (ArrayList<Spot>)results.values; 
//     notifyDataSetChanged(); 
       } 

       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 
        Log.d("test1","c "+constraint); 
        Log.d("test1","s "+mUnfilteredList.size()); 

        FilterResults results = new FilterResults(); 
        ArrayList<Spot> newList = new ArrayList<Spot>();    
        for (Spot obj : mUnfilteredList) { 
         // Compare the custom object and add to list if match 
         if (constraint.equals("bookmark")) { 
          if (obj.isStar == true) 
           newList.add(obj); 
         } else if (constraint.equals("select all")) { 
          newList.add(obj); 
         } 
        } 

        Log.d("test1",""+newList.size()); 
        results.values = newList; 
        results.count = newList.size(); 
        return results; 
       } 
      }; 
     } 
     return mFilter; 
    } 

} 

以上的陣列適配器定製過濾器定製過濾器,我的想法是有兩個過濾選項「書籤」 /「全選」,這意味着選擇所有顯示原始列表,而書籤顯示書籤僅限物品。在Android電子

的問題是,如果我點擊書籤,然後我點擊全選,結果仍是書籤項目。

所以我登錄的結果,我發現,在第二次mUnfilteredList = (ArrayList<Spot>) items;將重新使未過濾列表只是最後的過濾結果,而不是保持原始列表。我怎樣才能解決問題?

感謝您的幫助

+0

你在做什麼,當你點擊「書籤」?您的適配器是否連接到AutoCompleteTextView?你直接打電話給你的過濾器嗎? – pskink

+0

直接調用過濾器,像這樣sAdapter.getFilter()。filter(「select all」); 。sAdapter.getFilter()過濾器( 「書籤」); – user782104

+0

似乎你應該創建兩個適配器,然後 – pskink

回答

0

mFilteredList = new ArrayList(items);

+1

mFilteredList或mUnfilteredList? – pskink

+0

都需要新ArrayList(項目) – user782104

+0

好吧,所以我會建議創建兩個適配器,因爲現在你有三個數據副本,在大型數據集中可能是一個問題 – pskink