java - 如何过滤自定义ArrayList

标签 java android json arraylist

如何使用EditText在自定义ArrayList中实现过滤器,我正在使用ArrayList将JSON数据解析到ListView中。

我想允许用户在 EditText 中使用人名或城市过滤记录

public class Persons {

    private String name;
    private String city;

    .......

    // getters and setters

}

PersonsAdapter.java:

public class PersonsAdapter extends BaseAdapter implements Filterable {

ArrayList<Persons> arrayList;
ArrayList<Persons> filteredItems;
LayoutInflater inflater;
int Resource;
ViewHolder holder;
Context context;

private ItemFilter mFilter = new ItemFilter();

public PersonsAdapter(Context context, int resource, ArrayList<Persons> arrayList) {
    this.context = context;
    this.inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.Resource = resource;
    this.arrayList = arrayList;
    this.filteredItems = arrayList;
}


@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // convert view = design
    View view = convertView;
    if (view == null) {
        holder = new ViewHolder();
        view = inflater.inflate(Resource, null);

        holder.textName = (TextView) view.findViewById(R.id.textName);
        holder.textCity = (TextView) view.findViewById(R.id.textCity);


        view.setTag(holder);
    }
    else 
    {
        holder = (ViewHolder) view.getTag();
    }


    holder.textName.setText(arrayList.get(position).getName());
    holder.textCity.setText(arrayList.get(position).getCity());

    return view;

}

static class ViewHolder {

    TextView textName;
    TextView textCity;

}

public Filter getFilter() {
    return mFilter;
}

private class ItemFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        constraint = constraint.toString().toLowerCase();
        FilterResults result = new FilterResults();
        filteredItems = new ArrayList<Persons>();
        if (constraint != null && constraint.toString().length() > 0) {

            for (int i = 0, l = arrayList.size(); i < l; i++) {
                Persons person = arrayList.get(i);

                // here check with your property
                if (person.getName().toLowerCase().contains(constraint))
                    filteredItems.add(person);
            }
            result.count = filteredItems.size();
            result.values = filteredItems;
        } else {
            synchronized (this) {
                result.values = arrayList;
                result.count = arrayList.size();
            }
        }
        return result;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        filteredItems = (ArrayList<Persons>) results.values;
        notifyDataSetChanged();
    }
}


@Override
public int getCount() {
    // TODO Auto-generated method stub
    return arrayList.size();
}


@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return arrayList.get(position);
}


@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

}

最佳答案

尝试使用下面的代码来解决您的问题并学习 Filterable 接口(interface)的正确实现

替换现有代码中的以下行,以免每次都实例化

private ItemFilter mFilter = new ItemFilter();

private ItemFilter mFilter;

private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (constraint != null && constraint.length() > 0) {
                ArrayList<Persons> filterList = new ArrayList<Persons>();
                for (int i = 0; i < filteredItems.size(); i++) {

                    Persons person = filteredItems.get(i);
                    String name = person.getName().toUpperCase();
                    String city = person.getCity().toUpperCase();
                    if (name.contains(constraint.toString().toUpperCase()) || city.contains(constraint.toString().toUpperCase())) {

                        filterList.add(person);
                    }
                }
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = filteredItems.size();
                results.values = filteredItems;
            }
            return results;

        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            arrayList  = (ArrayList<Persons>) results.values;
            notifyDataSetChanged();
        }

    }

 public Filter getFilter() {
     if (itemFilter == null) {
         itemFilter = new ItemFilter();
     }
     return itemFilter;
 }

 @Override
 public long getItemId(int position) {
     return arrayList.indexOf(getItem(position));
 }

关于java - 如何过滤自定义ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31786962/

相关文章:

java - 即使表中的数据不为零,使用简单算术运算和别名时 JDBC 查询也会返回零

android - 将徽章计数器添加到 Android 中的汉堡导航菜单图标

android - 来自视频 url 的拇指在 android 4.0 及更高版本上返回 null

java - 为什么这个 equals & hashCode 覆盖不会导致异常或错误?

java - 看不懂 3D 数组

java 使用 charAt() 在字符串中赋值

java - 单击两次后退按钮以退出 Activity

javascript - 使用 Lodash 从键值对数组创建对象

arrays - 如何在 Spark 中将字符串解析为数组?

javascript - JSON 和 jQuery 搜索