在过去的几个小时里,我正在浏览一些listview优化但是我没有成功解决我的滞后列表视图,所以从行到行我开始将我的代码恢复到更早和更简单的版本来找出问题。因此,我使用包含imageview和两个textview的customadapter填充listview。从项目中删除图像后,我的列表视图仍然很慢,然后猜测:如果我删除textviews的自定义字体,我的lagginess消失了。我使用简单的Calibri,这是一个内置字体,所以我不明白为什么它减慢了我的listview。有什么建议可以解决这个问题吗?
//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);
答案 0 :(得分: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
参数为null
或Typeface.createFromAsset
返回null
,请务必添加支票以返回默认字体。
答案 1 :(得分:2)
可能是因为您正在为每个TextView创建新对象。
重复以下代码时,
Typeface.createFromAsset(getActivity().getAssets(), "fonts/CALIBRI.TTF")
这意味着您正在创建一个新对象。相反,您应该为您的Typeface创建一个对象,并将其存储在全局并在列表视图中使用它。建议不要为每一行创建新对象。
让我们这样说,
1)为你的适配器创建一个构造函数,然后用它来创建这个Typeface对象,
Typeface typeface= null; //global declaration
public void constructorSample()
{
typeface= Typeface.createFromAsset(getActivity().getAssets(), "fonts/CALIBRI.TTF");
}
然后像这样使用它。
viewHolder.text_ttd.setTypeface(typeface);
答案 2 :(得分:1)
我同意上述答案。另一种解决方案是创建一个包含字体的单例类。