2011-12-20 3 views
8

này được bộ chuyển đổi tùy chỉnh của tôi thừa hưởng từ BaseAdapter:Làm cách nào để triển khai bộ lọc cho BaseAdapter tùy chỉnh với ListView?

public class LocationItemAdapter extends BaseAdapter implements Filterable { 
    private Activity context; 
    private String[] names; 
    private Bitmap[] iconBitmaps; 
    private String[] categories; 
    private String[] ratings; 
    private boolean notifyChanged = true; 

    public LocationItemAdapter(Activity activityContext, String[] names, Bitmap[] iconBitmaps, String[] categories, String[] ratings) { 
     super(); 
     this.context = activityContext; 
     this.names = names; 
     this.iconBitmaps = iconBitmaps; 
     this.categories = categories; 
     this.ratings = ratings; 
    } 

    public int getCount() { 
     return names.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public static class ItemViewHolder { 
     TextView nameTextView; 
     TextView categoryTextView; 
     TextView ratingTextView; 
     ImageView mapIconImageView; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ItemViewHolder holder; 
     LayoutInflater inflater = context.getLayoutInflater(); 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.location_item, null); 
      holder = new ItemViewHolder(); 
      holder.nameTextView = (TextView) convertView.findViewById(R.id.location_item_xml_textview_name); 
      holder.categoryTextView = (TextView) convertView.findViewById(R.id.location_item_xml_textview_category); 
      holder.ratingTextView = (TextView) convertView.findViewById(R.id.location_item_xml_textview_rating); 
      holder.mapIconImageView = (ImageView) convertView.findViewById(R.id.location_item_xml_imageview_location_icon); 

      convertView.setTag(holder); 
     } 
     else { 
      holder = (ItemViewHolder) convertView.getTag(); 
     } 

     holder.nameTextView.setText(names[position]); 
     holder.categoryTextView.setText(categories[position]); 
     holder.ratingTextView.setText(ratings[position]); 
     holder.mapIconImageView.setImageBitmap(iconBitmaps[position]); 

     return convertView; 
    } 

    public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
     notifyChanged = true; 
    } 

    public android.widget.Filter getFilter() { 
     return new android.widget.Filter() { 
      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults(); 
       if (constraint != null && constraint.toString() > 0) { 

       } 
       else { 
       } 
       results.values = filteredResults; 
       return results; 
      } 
     }; 
    } 
} 

tôi đã tìm kiếm và phát hiện ra rằng hai chức năng mà tôi cần phải thực hiện là:

  1. protected void publishResults(CharSequence constraint, FilterResults results)
  2. protected FilterResults performFiltering(CharSequence constraint)

Ràng buộc bộ lọc của tôi là mảng chuỗi "tên" và tôi đoán là performFiltering sẽ hoạt động một tìm kiếm dựa trên văn bản "ràng buộc". Điều làm tôi bối rối là loại results.valueobject. Vì vậy, sau khi tôi thực hiện tìm kiếm trên name, tôi nên gán loại dữ liệu nào cho results.values? Và chức năng publishResults làm gì? Bất cứ ai có thể cho tôi một ví dụ về hai chức năng? Cảm ơn trước,

+0

Bạn đã xác minh câu trả lời dưới đây. Nó hoạt động hoàn hảo cho tôi. – blganesh101

Trả lời

2

Bạn có thể làm như sau trong performFiltering

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

       names = results.values(); // copy the results to your original names and refresh list 
       notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      String [] resultNames=new String[names.length]; 
      int count=0; 

      if (constraint != null && constraint.toString() > 0) { 
        for(String name:names) 
        { 
         if(name.contains(constraint)) // whatever search condition you need 
          resultNames[count++]=name; 
        } 
      } 
      else { 

      } 
      results.values = resultNames; 
      return results; 
     }