【问题标题】:Custom filter for the array adapter in androidandroid中数组适配器的自定义过滤器
【发布时间】:2014-04-01 04:24:51
【问题描述】:
public class SpotAdapter extends ArrayAdapter<Spot> {

    private ArrayList<Spot> mFilteredList, mUnfilteredList;
    private Filter mFilter;

    public SpotAdapter(Context context, int resource, List<Spot> items) {
        super(context, resource, items);
        mUnfilteredList = (ArrayList<Spot>) items;
        mFilteredList = (ArrayList<Spot>) items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {
            LayoutInflater vi;
            vi = LayoutInflater.from(getContext());
            v =  vi.inflate(R.layout.record_row, null);
        }

        Spot p = (Spot) mFilteredList.get(position);

        if (p != null) {
            TextView nameView = (TextView) v.findViewById(R.id.name);
            TextView addressView = (TextView) v.findViewById(R.id.address);
            TextView typeView = (TextView) v.findViewById(R.id.type);
            TextView contactView = (TextView) v.findViewById(R.id.contact);
            ImageView starBtn = (ImageView) v.findViewById(R.id.star);

            contactView.setVisibility(View.GONE);
            nameView.setText(p.name);
            addressView.setText(p.address);
            typeView.setText(p.type == 1 ? "Leisure" : "Shopping");
            starBtn.setTag("" + p.id);
            starBtn.setVisibility(p.isStar ? View.VISIBLE :  View.GONE);
        }

        return v;

    }

    @Override
    public Filter getFilter() {
        if(mFilter == null) {
            mFilter = new Filter() {

                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    mFilteredList = (ArrayList<Spot>)results.values;
                    clear();
                    int count = mFilteredList.size();
                    for (int i=0; i<count; i++)
                    {
                        Spot s = (Spot)mFilteredList.get(i);
                        add(s);
                    }
//                  
//                  mFilteredList = (ArrayList<Spot>)results.values;
//                  notifyDataSetChanged();
                }

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    Log.d("test1","c "+constraint);
                    Log.d("test1","s "+mUnfilteredList.size());

                    FilterResults results = new FilterResults();
                    ArrayList<Spot> newList = new ArrayList<Spot>();              
                    for (Spot obj : mUnfilteredList) {
                        // Compare the custom object and add to list if match
                        if (constraint.equals("bookmark")) {  
                            if (obj.isStar == true)
                                newList.add(obj); 
                        } else if (constraint.equals("select all")) {
                            newList.add(obj);
                        }
                    }

                    Log.d("test1",""+newList.size());
                    results.values = newList;
                    results.count = newList.size();
                    return results;
                }
            };
        }
        return mFilter;
    }

}

以上是自定义过滤器,我的想法是有两个过滤器选项“bookMark”/“select all”,即全选显示原始列表,而bookMark只显示书签项。

问题是,如果我点击书签,然后我点击全选,结果仍然是书签项。

所以我记录了结果,我发现mUnfilteredList = (ArrayList&lt;Spot&gt;) items; 第二次会重新运行,所以未过滤的列表只是最后一个过滤结果,而不是保留原始列表。我该如何更改以解决问题?

感谢您的帮助

【问题讨论】:

  • 点击“书签”时你在做什么?您的适配器是否连接到 AutoCompleteTextView ?你直接调用你的过滤器吗?
  • 直接调用filter,像这样 sAdapter.getFilter().filter("select all"); sAdapter.getFilter().filter("书签");
  • 看来你应该创建两个适配器然后
  • 为什么 mUnfilteredList 会受到影响?我尝试登录构造函数,但它只运行 mUnfilteredList = (ArrayList) items; 1次,所以它不应该改变,谢谢
  • 我的猜测是 mUnfilteredList = (ArrayList) items;错了,它不应该指向物品,而是复制物品

标签: android listview android-listview filter adapter


【解决方案1】:

mFilteredList = new ArrayList(items);

【讨论】:

  • mFilteredList 或 mUnfilteredList ?
  • 两者都需要是新的ArrayList(items)
  • 好的,所以我建议创建两个适配器,因为现在您拥有三个数据副本,这在大型数据集中可能是个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多