2012-03-09 2 views
3

Для решений, которые быстро, я объясню свою реализацию и тогда проблема =):Утечка памяти в ArrayAdapter

У меня есть объект:

Class myClass{ 
    ......attrs...... 
    ......getters and setters...... 

    public void setOnMyClassChangeListener(MyClassChangeListener listener){ 
     this.listener=listener; 
    } 
} 

И ListView monitorizing объекты этого класса с этим методом в нем ArrayAdapter:

static class ViewHolder { 
     View view1,view2,view3.....; 
    } 

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

    final ViewHolder holder; 
    View rowView = convertView; 
    if (rowView == null) { 
     LayoutInflater inflater = (LayoutInflater) getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowView = inflater.inflate(R.layout.templaterow, null, true); 
     holder = new ViewHolder(); 
     holder.view1=.....; 
     holder.view2=.....; 
     holder.view3=.....; 
     rowView.setTag(holder); 
    } else { 
     holder = (ViewHolder) rowView.getTag(); 
    } 
    MyClass object= items.get(position) 
    object.setOnMyClassChangeListener(MyClassChangeListener(){ 
      public void onMyClassChangeListener(MyClass obj){ 
       holder.view1.setXX(obj.getValue1()); 
       holder.view2.setXX(obj.getValue2()); 
       ...... 
      } 
    } 
    ); 
} 

Так что я думаю, что я утечки памяти, потому что слушатель снова установить после выхода на ListActity, а затем держатель просочилась правильно?

Есть ли способ лучше, чем повторить переход Адаптер в onStop, удалив слушателей?

Благодаря

ответ

0

Да есть лучший метод: не установлен такой приемник на свой объект, который имеет ссылки на соображения.

Вместо этого вы просто модифицируете модель (MyClass), а затем вызываете адаптер.notifyDatasetChanged() в ArrayAdapter. Затем ListView будет перерисовываться.