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);
        }
    }

}

这样,Typeface 将只创建一次,不需要每次都重新创建。

name如果参数是nullTypeface.createFromAsset返回,请记住添加一个检查以返回默认字体null

于 2013-01-07T10:39:02.933 回答
2

这可能是因为您正在为每个 TextView 创建新对象。

当您重复以下代码时,

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

这意味着您正在创建一个新对象。相反,您应该为您的字体创建一个对象并将其全局存储并在您的列表视图中使用它。不建议为每一行创建一个新对象。

让我们说这样的话,

1)有一个你的适配器的构造函数,并在其中创建这个 Typeface 对象一次,像这样,

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 回答