Android ArrayAdapter performFilter清除所有值

时间:2016-05-05 15:39:59

标签: android listview filter android-arrayadapter

我有一个使用SearchView过滤的arrayAdapter。过滤工作正常,但我的问题是它还清理了另一个不应编辑的实体:

public class LvSecurityAdapter extends ArrayAdapter<Security> implements Filterable{

    private ArrayList<Security> allSecurities;
    private ArrayList<Security> securities;
    private Context ctx;

    public LvSecurityAdapter(Context ctx, int tvResourceInt, ArrayList<Security> securities) {
        super(ctx, tvResourceInt, securities);
        this.securities = securities;
        this.allSecurities = securities;
        this.ctx = ctx;
    }

    @Override
    public int getCount() {
        return this.securities.size();
    }

    @SuppressLint("InflateParams")
    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.row_lv_security, null);

        Security security = securities.get(position);

        final ImageView img = (ImageView) view.findViewById(R.id.ivTipologia);
        final TextView tvName = (TextView) view.findViewById(R.id.tvName);
        final TextView tvDescription = (TextView) view.findViewById(R.id.tvDescription);
        final TextView tvTags = (TextView) view.findViewById(R.id.tvTags);

        img.setBackground(ctx.getDrawable(security.getTipology().getImageId()));
        tvName.setText(security.getName());
        tvDescription.setText(security.getDescription());
        tvTags.setText(security.getTag());
        return view;
    }

    private void notifyThis(ArrayList<Security> values){
        securities.clear();
        securities.addAll(values);
        this.notifyDataSetChanged();
    }

    @Override
    public Filter getFilter() {
        return new Filter(){
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                notifyThis((ArrayList<Security>)results.values);
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                ArrayList<Security> securitiesFilteredLocal = new ArrayList<>();
                for (Security s : allSecurities){
                    if(s.getName().toLowerCase().contains(constraint.toString().toLowerCase()) ||
                            s.getDescription().toLowerCase().contains(constraint.toString().toLowerCase())||
                            s.getTag().toLowerCase().contains(constraint.toString().toLowerCase())||
                            s.getTipology().getName().toLowerCase().contains(constraint.toString().toLowerCase())){
                        securitiesFilteredLocal.add(s);
                    }
                }
                results.count = securitiesFilteredLocal.size();
                results.values = securitiesFilteredLocal;
                return results;
            }
        };
    }
}

正如您所看到的,我的构造函数中有两个实体:securitiesallSecurities

securities是填充适配器的实体和已过滤的实体。

allSecurities是一个帮助实体。我需要它,因为在过滤后,如果我从过滤器中删除了一些字符,我需要检索所有实体并再次执行过滤器,但是当我过滤我的结果并将其保存到securities时,它也会将过滤掉结果导致allSecurities

我的问题很简单:为什么它会覆盖我的实体,如果它从未被编辑过?我怎样才能避免压倒一切?

全部谢谢

1 个答案:

答案 0 :(得分:2)

this.allSecurities = securities;

这意味着allSecuritiessecurities都引用相同的ArrayList。无论你对一个人做什么,也会发生在另一个人身上。你应该做的是复制ArrayList

this.allSecurities = new ArrayList<>(securities);

现在对securities的任何修改都不会修改allSecurities