【问题标题】:How to implement filter for custom BaseAdapter with ListView?如何使用 ListView 实现自定义 BaseAdapter 的过滤器?
【发布时间】:2012-01-24 18:43:08
【问题描述】:

这是我从 BaseAdapter 继承的自定义适配器:

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;
            }
        };
    }
}

我搜索了一下,发现需要实现的两个功能是:

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

我的过滤器约束是“名称”字符串数组,我猜performFiltering 会根据文本“约束”执行搜索。让我感到困惑的是results.value 的类型是object。那么在我对name 执行搜索后,我应该将什么类型的数据分配给results.values?函数publishResults 有什么作用?谁能给我一个关于这两个功能的例子?提前致谢,

【问题讨论】:

  • 您是否验证了下面的答案。它非常适合我。

标签: android listview filter


【解决方案1】:

您可以在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;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2010-11-07
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    相关资源
    最近更新 更多