2012-04-04 18 views
12

Dường như trường hợp sử dụng cho một Adapter đó là Filterable là để lọc theo một String hoặc CharSequence mà có thể được nhập vào bởi người sử dụng trong một EditText, nhưng đây có phải là tiêu chí duy nhất nền tảng này cung cấp cho lọc Adapter s?Bộ lọc ListAdapter khác với sử dụng Strings?

Điều gì xảy ra nếu tôi có cấu trúc dữ liệu sao lưu của các đối tượng có thể được phân loại khác? ví dụ: nếu tôi có danh sách đối tượng Áo sơ mi có thuộc tính enum, color thì sao? Người dùng có thể lọc danh sách các áo sơ mi từ danh sách có sẵn color s. Là một nhà phát triển ứng dụng tốt, tôi muốn sử dụng nền tảng được xây dựng trong cơ chế lọc, nhưng tất cả những gì tôi có thể tìm thấy là Filter với các phương pháp như filter (CharSequence constraint). Chắc chắn là tôi đang thiếu gì đó. Tôi thấy làm thế nào nó sẽ được đơn giản, đủ để thực hiện cơ chế lọc này bên trong tùy chỉnh của riêng tôi BaseAdapter, nhưng nó cảm thấy như có nên có một số được xây dựng trong cách để làm bộ lọc tùy chỉnh. Bất kỳ ai? Cảm ơn trước.

+0

FacebookSDK 3.0 không có cách lọc thông số khác. Vấn đề là họ đã triển khai lớp lọc mới từ đầu. Chọn PickerFragment.GraphObjectFilter để biết thêm chi tiết. – mach

+1

Tôi không thể tin rằng câu hỏi này không có nhiều lượt xem và số phiếu bầu. Thực tế đằng sau câu hỏi của OP nhấn mạnh một sự loại trừ hoàn toàn ngu ngốc từ khung android cốt lõi. Lọc trên bất cứ điều gì khác hơn là của String? Ai là địa ngục cần điều đó? Không thể tin được – wkhatch

Trả lời

0

Trong Android, adapter của bạn có thể thực hiện các lọc (mà bạn có thể cùng với bộ lọc bạn đã tìm kiếm)
=> Đây là mối liên hệ giữa dữ liệu của bạn với các bộ lọc.
Dưới đây là liên kết [Bạn sẽ thấy câu trả lời được đánh dấu] List View Filter Android

0

bạn có thể tạo FilterAdapter riêng của bạn và mang logic riêng của bạn, ví dụ này chăm sóc đối tượng với hai chuỗi và quản lý bộ lọc:

public class TwoWordsFilter extends Filter { 
ArrayList<BranchData> branchDatas = new ArrayList<BranchData>(); 
private BranchDataAdapter branchDataAdapter; 
public TwoWordsFilter(ArrayList<BranchData> branchDatas,BranchDataAdapter branchDataAdapter) { 
    this.branchDatas = branchDatas; 
    this.branchDataAdapter=branchDataAdapter; 
} 

@Override 
protected FilterResults performFiltering(CharSequence constraint) { 
    FilterResults results = new FilterResults(); 
    if (constraint==null || constraint.length()==0){ 
     results.values=branchDatas; 
     results.count=branchDatas.size(); 
    }else { 
     List<BranchData> mBranchDatas=new ArrayList<BranchData>(); 
     for (BranchData branchData : branchDatas) { 
      if (branchData.getBranch_name().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase()) || 
      branchData.getCity().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase())){ 
       mBranchDatas.add(branchData); 
      } 
     } 
     results.values=mBranchDatas; 
     results.count=mBranchDatas.size(); 

    } 
    return results; 
} 

@Override 
protected void publishResults(CharSequence constraint, FilterResults results) { 
    if (results.count == 0) 
     branchDataAdapter.notifyDataSetInvalidated(); 
    else { 
     branchDataAdapter.setBranchDatas((ArrayList<BranchData>) results.values); 
     branchDataAdapter.notifyDataSetChanged(); 
    } 
} 

}

trong adapter của bạn đặt này:

@Override 
public Filter getFilter() { 
    if (twoWordsFilter==null){ 
     twoWordsFilter=new TwoWordsFilter(branchDatas,this); 
    } 
    return twoWordsFilter; 
}