4

ActivityGridViewこのXMLレイアウトから膨らませています:

<GridView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnWidth="@dimen/thumbnail_size"
    android:gravity="fill"
    android:horizontalSpacing="16dp"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:verticalSpacing="16dp" />

その中のアイテムはRelativeLayouts で、それぞれ固定の高さに設定されています。をプロファイリングしているときに、 を入力すると測定パスが発生し、が再測定されることActivityに気付きました。次に、アダプターを何度も呼び出して、すべての子ビューを測定します。これは不必要な作業です。(a) どの子が表示されるかは変更されていないため、必要なすべてのビューが既に含まれているためです。(b) どの子ビューもサイズを変更できません。ActionModeGridViewGridViewgetView()

私はそれを知ってListViewおりGridView、簡単なケースで作業を回避するために彼らができる多くのトリックを持っています.これは、彼らが最適化できる特別なケースのようです. ここで再度GridView呼び出す必要がないことを認識させるために設定できるものはありますか? getView()または、スタックの上位に移動して、パスに出入りするときにメジャー パスを完全に回避できActionModeますか? 明確にするために、アダプターの動作は正しく、getView()呼び出しによって問題が発生することはありません。アプリの消費サイクルを減らしたいだけです。

NBアイテムの幅と高さを固定して、を次のように置き換えても、呼び出しGridView回数は変わりません(ただし、見苦しくなります)。getView()Activity

<GridView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="beforeDescendants"
    android:columnWidth="@dimen/thumbnail_size"
    android:horizontalSpacing="16dp"
    android:numColumns="3"
    android:stretchMode="none"
    android:verticalSpacing="16dp" />
4

3 に答える 3

2

GridView の代わりに ListView を使用します。実装を見てください (API 16):

ListView.onMeasure(...) {
...
    if (mItemCount > 0 && (widthMode == MeasureSpec.UNSPECIFIED ||
            heightMode == MeasureSpec.UNSPECIFIED)) {
        final View child = obtainView(0, mIsScrap);
...
}

GridView.onMeasure(...) {
...
    final int count = mItemCount;
    if (count > 0) {
        final View child = obtainView(0, mIsScrap);
...
}

バグのようです。

于 2013-08-09T10:50:17.123 に答える