6

これが私のセットアップです。ListViewの中にあるいくつかの派手なヘッダーを持つカスタムがありViewPagerます。私は、自尊心のある開発者が行うように、ダウンロードしてローカルに保存した画像のメモリ キャッシュを維持しています。

私が抱えている問題は、キャッシュからビットマップを使用して のメソッドで を呼び出すたびにsetImageBitmap(Bitmap bm)ImageViewすべてListViewgetView()ビューがonMeasure(). AndroidのImageViewソースコードを調べたところ、次のことがわかりました。

public void setImageDrawable(Drawable drawable) {
    if (mDrawable != drawable) {
        mResource = 0;
        mUri = null;

        int oldWidth = mDrawableWidth;
        int oldHeight = mDrawableHeight;

        updateDrawable(drawable);

        if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
            requestLayout();
        }
        invalidate();
    }
}

したがって、 が以前のと異なる寸法を持っている場合はいつでも、 setImageDrawable(によって呼び出されるsetImageBitmap) がそのレイアウトを要求することがわかります。問題は、myが静的に 60 dp x 60 dp に設定されているため、画像のサイズに関係なくサイズが変わらないことです。drawableDrawableImageView

スクロールするたびにレイアウトが常に再測定されるのを回避する方法はありますか? onMeasureとのonLayout呼び出しはViewツリーを上に向かって伝播しているため、リストのスクロールの途中でListViewViewPagerも測定されており、これは明らかに重大なパフォーマンスの問題 (~100ms の UI ジャンプ) を引き起こしています。

パフォーマンスがひどいので、修正する必要があります。誰にも解決策はありますか?

ありがとう。

4

1 に答える 1

2

しばらく経ちましたが、最近同様の問題があり、リストビューの高さの 1 行が大きく変化し、listview.onmeasure が呼び出されました。

API-14 以降に対してビルドしている場合は、SDK ソース コードにブレークポイントを設定できます。これは、高さが変更された理由を理解するのに役立ちます。

于 2013-01-10T23:12:44.800 に答える