У меня есть 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
Что кажется неправильным?
EDIT @12: 47 GMT:
На самом деле это немного сложнее, чем это. Мой интерфейс приложения основан на 2 частях. Один из них - мозг экрана, создание представлений, обработка пользовательского ввода и т.д. Другим является Fragment
, если устройство имеет андроид 3.0, в противном случае это Activity
.
GC произошел на моем устройстве Nexus One 2.3.3, поэтому используйте Activity
. У меня нет моего Xoom со мной, чтобы проверить поведение с помощью Fragment
.
Я мог бы отправить источник, если потребуется, но позвольте мне попытаться объяснить это:
-
RootList
- это мозг пользовательского интерфейса. Это содержит:- a
List<>
элементов, которые будут помещены вListView
. - метод, который создает этот список из SQLite db
- пользовательский BaseAdapter, который содержит в основном только метод getView, вставленный выше
- a
-
RootListActivity
являетсяListActivity
, который:- использует XML-макет
- У макета, конечно, есть список с id
android.id.list
- обратные вызовы
Activity
перенаправляются в классRootList
с использованием экземпляра RootList, созданного при создании действия (конструктор, а неonCreate
) - в
onCreate
, я вызываюRootList
методы, которые создадут список элементов, и установите данные списка в новый экземпляр моего пользовательского класса, полученного изBaseAdapter
EDIT on may 17th @9:36 PM GMT:
Здесь приведен код действия и класс, который делает вещи. http://pastebin.com/EgHKRr4r