Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用ListView实现自定义BaseAdapter的筛选器?_Android_Listview_Filter - Fatal编程技术网

Android 如何使用ListView实现自定义BaseAdapter的筛选器?

Android 如何使用ListView实现自定义BaseAdapter的筛选器?,android,listview,filter,Android,Listview,Filter,这是从BaseAdapter继承的自定义适配器: public class LocationItemAdapter extends BaseAdapter implements Filterable { private Activity context; private String[] names; private Bitmap[] iconBitmaps; private String[] categories; private String[] ra

这是从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;
            }
        };
    }
}
我搜索发现我需要实现的两个功能是:

  • 受保护的void publishResults(CharSequence约束、FilterResults结果)
  • protectedfilterResults性能过滤(字符序列约束)

  • 我的筛选约束是“name”字符串数组,我猜
    performFiltering
    将根据文本“constraint”执行搜索。让我困惑的是
    results.value
    的类型是
    object
    。因此,在我对
    名称
    执行搜索之后,我应该为
    结果.值
    分配什么类型的数据?函数
    发布结果
    的作用是什么?有人能给我举一个关于这两个函数的例子吗?提前感谢,

    您可以在
    性能过滤中执行以下操作

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

    你验证了下面的答案了吗。它对我非常有效。