更改ListView字体

时间:2012-08-16 15:39:15

标签: android listview android-asynctask

有什么方法可以加快我应用中字体的更改速度?

我有一个ListView从XML在线加载其列表。这一切都很好,但我需要将其字体从我的资源文件夹更改为自定义字体。

当我申请时:

 TxEventName = (TextView)row.findViewById(id.eventNameTx);
 TxEventName.setText(getEventsCount(position));
 TxEventName.setTypeface(Utilities.textFont(this.getContext()));

它变慢了,因为我应用了setTypeface

有时它会首先加载UI布局然后列表,有时它只是一个延迟的黑屏,然后,当下一个活动出来时,列表已经存在。

我甚至使用AsyncTask加载列表的值,如:

private class initList extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... params) {

        SimpleDateFormat formatterc; 
        Date xdatec=null; 
        formatterc = new SimpleDateFormat("dd/MM/yy");
        try {
            xdatec = (Date)formatterc.parse(date);
            SimpleDateFormat frmtr = new SimpleDateFormat(dateTemplateForChecking);
            selectedDate = frmtr.format(xdatec).toString();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        for(int i = 0; i < XMLParser.ppEvents.size(); i++) {
            EventsObj evObj = XMLParser.ppEvents.get(i);

            for(int j = 0; j < evObj.date.size(); j++) {
                if(selectedDate.equalsIgnoreCase(evObj.date.get(j))) {

                    StringBuilder sbldr = new StringBuilder();
                    sbldr.append(evObj.act_id);
                    sbldr.append("!");
                    if (SelectLanguage.lang == "ENG"){
                    sbldr.append(evObj.name_en);
                    } else if (SelectLanguage.lang == "TCH"){
                        sbldr.append(evObj.name_tc);
                    } else if (SelectLanguage.lang == "SCH"){
                        sbldr.append(evObj.name_sc);
                    }

                    mainEvents.add(sbldr.toString());
                    eventID.add(Integer.toString(evObj.act_id));
                }   
            }
        }
        adapter = new events_adapter(PublicProg.this, layout.events_adapter, id.eventNameTx, mainEvents);
        return null;
    }

    protected void onPostExecute(Void result){
        eventList.setAdapter(adapter);
    }

    protected void onPreExecute(){
        Bundle ext = getIntent().getExtras();

        position = ext.getString("position");
        date = ext.getString("date");

        mainEvents = new ArrayList<String>();
        eventID = new ArrayList<String>();
    }
}

3 个答案:

答案 0 :(得分:1)

我用它来为Typeface

创建简单缓存
public class Typefaces{

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

    public static Typeface get(Context c, String name){
        synchronized(cache){
            if(!cache.containsKey(name)){
                Typeface t = Typeface.createFromAsset(
                        c.getAssets(), 
                        String.format("fonts/%s.OTF", name)
                    );
                cache.put(name, t);
            }
            return cache.get(name);
        }
    }

}

在适配器构造函数中初始化您的自定义Typeface

myriadBold = Typefaces.get(mContext, "MYRIADPRO-BOLD");

并在getView

中使用它
txt.setTypeface(myriadBold);

这样可以减少系统调用数skia以生成用户字体。

答案 1 :(得分:0)

也许你在哪里设置字体不是好地方。

还有Utilities.textFont(this.getContext()),你可能正在阅读文件系统中的字体,这可能会减慢你的进程,并且根据调用这一行的位置,你正在锁定UI。

答案 2 :(得分:0)

您可以通过自定义Typeface

设置TextView
public class TextViewGeorgiaBold extends TextView {

Resources res = getResources();
String font_path = res.getString(R.string.MAIN_FONT);

public TextViewGeorgiaBold(Context context, AttributeSet attrs, int defStyle) {
    super(context.getApplicationContext(), attrs, defStyle);
    Typeface font = Typeface.createFromAsset(getContext()
            .getApplicationContext().getAssets(), font_path);
    setTypeface(font);
}

public TextViewGeorgiaBold(Context context, AttributeSet attrs) {
    super(context.getApplicationContext(), attrs);
    Typeface font = Typeface.createFromAsset(getContext()
            .getApplicationContext().getAssets(), font_path);
    setTypeface(font);

}

public TextViewGeorgiaBold(Context context) {
    super(context.getApplicationContext());
    Typeface font = Typeface.createFromAsset(getContext()
            .getApplicationContext().getAssets(), font_path);
    setTypeface(font);
}

}

因为它在布局膨胀时设置了TypeFace

可能会帮助你。