2016-05-05 31 views
0

我有一個arrayAdapter,它是用SearchView過濾的。過濾工作,但我的問題是,它也清理不應該被編輯另一個實體:Android ArrayAdapter performFilter清理所有值

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

我的問題很簡單:爲什麼它覆蓋我的實體,如果它永遠不會被編輯訪問?我怎樣才能避免壓倒一切?

感謝所有

回答

2
this.allSecurities = securities; 

這意味着allSecuritiessecurities都引用相同ArrayList。無論你對一個人做什麼,都會發生在另一個人身上。你應該做的是做一個ArrayList的副本。現在

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

任何修改securities不會也修改allSecurities

+0

我完全忘記了內存參考,非常感謝! :) –

+0

(需要5分鐘才能接受,我在等待它) –

+0

不客氣。很高興我能幫上忙。 –