I have a custom TextView, with a personalized font attribute:
public class TextViewPlus extends TextView { private static final String TAG = "TextViewPlus"; public TextViewPlus(Context context) { super(context); } public TextViewPlus(Context context, AttributeSet attrs) { // This is called all the time I scroll my ListView // and it make it very slow. super(context, attrs); setCustomFont(context, attrs); } public TextViewPlus(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setCustomFont(context, attrs); } private void setCustomFont(Context ctx, AttributeSet attrs) { TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus); String customFont = a.getString(R.styleable.TextViewPlus_customFont); setCustomFont(ctx, customFont); a.recycle(); } public boolean setCustomFont(Context ctx, String asset) { Typeface tf = null; try { tf = Typeface.createFromAsset(ctx.getAssets(), asset); setTypeface(tf); } catch (Exception e) { Log.e(TAG, "Could not get typeface: "+e.getMessage()); return false; } return true; } }
I'm using it in my XML files with the attribute customFont="ArialRounded.ttf", and it is working quite well.
I'm using this TextViewPlus in a ListView, populated with an ArrayAdapter.
TextViewPlus dataText = (TextViewPlus) itemView.findViewById(R.id.data_text); dataText.setText("My data String");
My problem is that the performance, when I'm scrolling the ListView, are terrible! Very slow and full of lags. The TextViewPlus constructor n°2 it's called all the time i scroll the list.
If I change TextViewPlus in a normal TextView, and use dataText.setTypeface(myFont), everything is smood and is working well.
How can I use my TextViewPlus without performance issue?
Why don't you keep the created typface
object in memory so that you don't create every time the text view is getting created.
Following is a sample class that creates and cache the typeface object:
public class TypeFaceProvider { public static final String TYPEFACE_FOLDER = "fonts"; public static final String TYPEFACE_EXTENSION = ".ttf"; private static Hashtable<String, Typeface> sTypeFaces = new Hashtable<String, Typeface>( 4); public static Typeface getTypeFace(Context context, String fileName) { Typeface tempTypeface = sTypeFaces.get(fileName); if (tempTypeface == null) { String fontPath = new StringBuilder(TYPEFACE_FOLDER).append('/').append(fileName).append(TYPEFACE_EXTENSION).toString(); tempTypeface = Typeface.createFromAsset(context.getAssets(), fontPath); sTypeFaces.put(fileName, tempTypeface); } return tempTypeface; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With