У меня есть ListView, который использует пользовательский адаптер. Пользовательский адаптер getView использует все рекомендуемые методы:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SuscriptionsViewsHolder holder;
ItemInRootList item = mItemsInList.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.label, null);
holder = new SuscriptionsViewsHolder();
holder.label = (TextView) convertView.findViewById(R.id.label_label);
holder.icon = (ImageView) convertView.findViewById(R.id.label_icon);
convertView.setTag(holder);
} else {
holder = (SuscriptionsViewsHolder) convertView.getTag();
}
String text = String.format("%1$s (%2$s)", item.title, item.unreadCount);
holder.label.setText(text);
holder.icon.setImageResource(item.isLabel ? R.drawable.folder : R.drawable.file );
return convertView;
}
Однако, когда я прокручиваю, это вяло из-за тяжелой сборки мусора:
GC_EXTERNAL_ALLOC freed 87K, 48% free 2873K/5447K, external 516K/519K, paused 30ms
GC_EXTERNAL_ALLOC freed 7K, 48% free 2866K/5447K, external 1056K/1208K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2866K/5447K, external 1416K/1568K, paused 28ms
GC_EXTERNAL_ALLOC freed 5K, 48% free 2865K/5447K, external 1600K/1748K, paused 27ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2865K/5447K, external 1780K/1932K, paused 30ms
GC_EXTERNAL_ALLOC freed 2K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed 2K, 48% free 2870K/5447K, external 1780K/1932K, paused 25ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed 3K, 48% free 2870K/5447K, external 1780K/1932K, paused 25ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2871K/5447K, external 1780K/1932K, paused 28ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2871K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 27ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 34ms
Что, похоже, не так?
РЕДАКТИРОВАТЬ @ 12: 47 GMT:
На самом деле это немного сложнее, чем это. Пользовательский интерфейс моего приложения состоит из 2 частей. Один - мозг экрана, создающий представления, обрабатывающий пользовательский ввод и т. Д. Другой - Fragment
, если устройство имеет Android 3.0, в противном случае это Activity
.
Сборщик мусора произошел на моем устройстве Nexus One 2.3.3, поэтому использовался Activity
. У меня нет моего Xoom, чтобы проверить поведение с Fragment
.
Я мог бы опубликовать источник, если потребуется, но позвольте мне попытаться объяснить это:
RootList
- это мозг интерфейса пользователя. Это содержит :
- a
List<>
предметов, которые будут помещены в ListView
.
- метод, который строит этот список из базы данных SQLite
- пользовательский BaseAdapter, который содержит в основном только метод getView, вставленный выше
RootListActivity
- это ListActivity
, который:
- использует макет XML
- макет, конечно, имеет список с идентификатором
android.id.list
- обратные вызовы
Activity
перенаправляются в класс RootList
с использованием экземпляра RootList, созданного при создании действия (конструктор, а не onCreate
)
- в
onCreate
я вызываю RootList
методы, которые создадут список элементов, и устанавливаю данные списка в новый экземпляр моего пользовательского класса, полученный из BaseAdapter
РЕДАКТИРОВАТЬ 17 мая @ 21:36 по Гринвичу:
Вот код Деятельности и класс, который делает вещи. http://pastebin.com/EgHKRr4r