カスタム アダプターを使用する 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:
実際はこれより少し複雑です。私のアプリの UI は 2 つの部分に基づいています。1 つは画面の頭脳で、ビューの作成、ユーザー入力の処理などを行います。もう 1 つは、Fragment
デバイスに Android 3.0 が搭載されている場合は 、そうでない場合は ですActivity
。
GC は Nexus One 2.3.3 デバイスで発生したため、 を使用しましたActivity
。 動作をテストするために Xoom を持っていないので、を使用できませんFragment
。
必要であればソースを投稿することもできますが、説明させてください。
RootList
UI の頭脳です。次のものが含まれます:List<>
に配置されるアイテムの一覧ですListView
。- SQLiteデータベースからこのリストを構築する方法
- 基本的に上記に貼り付けたgetViewメソッドのみを含むカスタムBaseAdapter
RootListActivity
は でありListActivity
、次のように なります。- XMLレイアウトを使用する
- レイアウトには当然ID付きのリストビューがあります
android.id.list
- コールバックは、アクティビティの作成時に作成された RootList のインスタンスを使用してクラス
Activity
に転送されます(コンストラクターではありません)RootList
onCreate
- では、アイテムのリストを作成する のメソッドを
onCreate
呼び出し、リストデータを から派生したカスタムクラスの新しいインスタンスに設定します。RootList
BaseAdapter
5月17日午後9時36分GMT編集:
以下は、アクティビティと、それを実行するクラスのコードです。http://pastebin.com/EgHKRr4r
ベストアンサー1
問題が見つかりました。アクティビティの XML レイアウトは次のとおりでした。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<include android:id="@+id/rootlist_header" layout="@layout/pre_honeycomb_action_bar" />
<ListView android:id="@android:id/list"
android:layout_below="@id/rootlist_header"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textColor="#444444"
android:divider="@drawable/list_divider"
android:dividerHeight="1px"
android:cacheColorHint="#00000000" />
</RelativeLayout>
を削除するとandroid:cacheColorHint="#00000000"
、重いGCがなくなり、スクロールがスムーズ! :)
このパラメータがなぜ設定されたのかはよくわかりません。必要ないからです。XML レイアウトを実際に構築するのではなく、コピー&ペーストしすぎたのかもしれません。
ご支援ありがとうございます。本当に感謝しています。