我有一个使用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;
}
};
}
}
正如您所看到的,我的构造函数中有两个实体:securities
和allSecurities
。
securities
是填充适配器的实体和已过滤的实体。
allSecurities
是一个帮助实体。我需要它,因为在过滤后,如果我从过滤器中删除了一些字符,我需要检索所有实体并再次执行过滤器,但是当我过滤我的结果并将其保存到securities
时,它也会将过滤掉结果导致allSecurities
。
我的问题很简单:为什么它会覆盖我的实体,如果它从未被编辑过?我怎样才能避免压倒一切?
全部谢谢
答案 0 :(得分:2)
this.allSecurities = securities;
这意味着allSecurities
和securities
都引用相同的ArrayList
。无论你对一个人做什么,也会发生在另一个人身上。你应该做的是复制ArrayList
。
this.allSecurities = new ArrayList<>(securities);
现在对securities
的任何修改都不会修改allSecurities
。