2

ここ数時間、リストビューの最適化を探していましたが、遅れたリストビューの解決に成功しなかったため、行ごとにコードを以前のより単純なバージョンに戻し、問題を特定し始めました。そこで、イメージビューと2つのテキストビューを含むカスタムアダプターをリストビューに入力します。アイテムから画像を削除した後、リストビューはまだ非常に遅いので、何を推測しますか。テキストビューのカスタム書体を削除すると、遅延がなくなります。組み込みのフォントであるシンプルなCalibriを使用しているので、リストビューが遅くなる理由がわかりません。この問題を解決するための提案はありますか?

//viewHolder.text_tt.setTypeface(Typeface.createFromAsset(getActivity().getAssets(), "fonts/CALIBRI.TTF")); 
//viewHolder.text_ttd.setTypeface(Typeface.createFromAsset(getActivity().getAssets(), "fonts/CALIBRI.TTF")); 

viewHolder.text_tt.setText(textNames[position]);
viewHolder.text_ttd.setText("Item " + position);
4

3 に答える 3

10

その理由は、アセットから書体を作成するのはかなり重いからです。私はそのようなTypefaceCacheを使用することを好みます。

public class TypefaceCache {

    private static final Hashtable<String, Typeface> CACHE = new Hashtable<String, Typeface>();

    public static Typeface get(AssetManager manager, String name) {
        synchronized (CACHE) {

            if (!CACHE.containsKey(name)) {
                Typeface t = Typeface.createFromAsset(manager, name);
                CACHE.put(name, t);
            }
            return CACHE.get(name);
        }
    }

}

このように、書体は1回だけ作成され、毎回再作成する必要はありません。

nameパラメータがnullまたはをTypeface.createFromAsset返す場合に備えて、デフォルトの書体を返すチェックを追加することを忘れないでくださいnull

于 2013-01-07T10:39:02.933 に答える
2

これは、TextViewごとに新しいオブジェクトを作成していることが原因である可能性があります。

以下のコードを繰り返すと、

Typeface.createFromAsset(getActivity().getAssets(), "fonts/CALIBRI.TTF")

これは、新しいオブジェクトを作成していることを意味します。代わりに、書体用に単一のオブジェクトを作成し、それをグローバルに保存して、リストビュー全体で使用する必要があります。行ごとに新しいオブジェクトを作成することはお勧めしません。

このようなことを言いましょう、

1)アダプターのコンストラクターを用意し、このタイプフェイスオブジェクトを次のように作成します。

Typeface typeface= null;  //global declaration

public void constructorSample()
{
   typeface= Typeface.createFromAsset(getActivity().getAssets(), "fonts/CALIBRI.TTF");
}

そして、このように使用します。

viewHolder.text_ttd.setTypeface(typeface);
于 2013-01-07T10:39:49.977 に答える
1

上記の回答に同意します。別の解決策は、書体を保持するシングルトンクラスを作成することです。

于 2013-01-07T10:59:44.907 に答える