1

Я реализовал просмотр разделенного списка, чтобы каждый раздел имел адаптер с использованием this guide и, вероятно, он заставляет просматривать виды снова и снова при прокрутке и повторном использовании, потому что есть разные адаптеры (но при прокрутке назад повторное использование, но для того же самого адаптера), и это метод GetView походит на это (упрощенный):Android ListView Memory Leak?

 Map< String, ? > object = null; 
     String id = null, title = null, rating = null, pic_url = null; 
     object = sectionContent.get(position).getMap(); 
     id = (String) object.get(EventRowValues.ROW_ID); 
     title = (String) object.get(EventRowValues.ROW_TITLE); 
     pic_url = (String) object.get(EventRowValues.ROW_PIC_URL); 

     View hView = convertView; 
     if (hView == null) { 
      hView = mInflater.inflate(R.layout.popularity_row, null); 
      ViewHolder holder = new ViewHolder(); 
      holder.pic = (ImageView) hView.findViewById(R.id.icon); 
      holder.title = (TextView) hView.findViewById(R.id.label); 
      hView.setTag(holder); 
     } 

     final ViewHolder holder = (ViewHolder) hView.getTag(); 

     holder.id = id; 

     mImageWorker.loadImage(pic_url, holder.pic); 

     holder.title.setText(title); 

     return hView; 

метод LoadImage от this google example.

Проблема в том, что при прокрутке это занимает больше памяти, например, 2 МБ для 5-10 строк. Когда я прокручиваю назад, он не занимает больше памяти, но, насколько я знаю, он не должен выделять такие объемы памяти, потому что он повторно использует представления, поскольку я ожидаю, что он возьмет память только тогда, когда она загрузится, и когда я прокручу, чтобы использовать те же представления и растровые изображения из кеша (поскольку большая часть чертежей является одним и тем же объектом, возвращаемым из кеша).

В чем проблема? Любая другая опция для более умного многоразового секционированного спискаView?

Большое спасибо.

+0

Ваша проблема решена моим решением? – Shrikant

ответ

2

Выяснено, Я использовал секционный вид таблицы из руководства, о котором я упомянул ранее, и он не будет повторно использовать ячейки должным образом. Я реализовал ExpandableListView с некоторыми исправлениями, чтобы заставить его работать, и теперь это здорово.

Спасибо.

1

комментарий mImageWorker.loadImage (pic_url, holder.pic); и показать различия в потреблении памяти

+0

Это то же потребление. 7MB для прокрутки списка (30 элементов). Вероятно, это представление распределения, и это imageViews отвечает за это потребление, и, возможно, ячейки ячеек выделяются и не используются повторно (но когда я прокручиваю назад, все равно 7 МБ). –

+0

Я удалил imageViews из xml и код, соответствующий этим представлениям, и теперь для этого списка требуется 3MB ... все еще слишком много ... –

+0

и все равно загружает до 2 мб для каждых новых 10 строк ? – logcat

2

Попробуйте это: UPDATE:

 ViewHolder holder = new ViewHolder(); 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      hView = mInflater.inflate(R.layout.popularity_row, null); 
      holder.pic = (ImageView) hView.findViewById(R.id.icon); 
      holder.title = (TextView) hView.findViewById(R.id.label); 
      hView.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

PS: Вы создали объект держателя дважды. Это действительно необходимо?

Какой андроид версии вы используете, сог я тоже была такая же проблема, я использовал версию 11, и на более высокую версию, если вы хотите, чтобы иметь возможность прокручивать список быстро, вам нужно дать android:hardwareAccelerated="true" атрибут в activity tag в файл манифеста.

+0

Спасибо, но какая разница между этим кодом и моим? Вы назначаете держатель даже в случаях, когда это не нужно. И вы имеете в виду уровень API? И что делает андроид: hardwareAccelerated? Спасибо –

+0

См. Мой обновленный код. Здесь я создал только один объект-держатель и использовал его в последующих вызовах. Существует разница между созданием объекта присваивающим ему значением. Здесь я создал объект только в первый раз и присвоил ему значение для последующих вызовов. Для HardwareAcceleration, пожалуйста, прочитайте: http://developer.android.com/guide/topics/graphics/hardware-accel.html – Shrikant

+0

Спасибо, я обновил вопрос после поиска интересных идей. –