2011-05-06 114 views
7

我試圖在我的ArrayAdapter中更改TextView的字體。字體chantelli_antiqua.ttf位於資產文件夾中。ArrayAdapter中textview的自定義字體

這裏是我的Java代碼:

listItemAdapter = new ArrayAdapter<MenuItem>(this, R.layout.listitem, menuItems); 

Typeface font = Typeface.createFromAsset(getAssets(), "chantelli_antiqua.ttf"); 
TextView v = (TextView)listItemAdapter.getView(0, null, null); 
v.setTypeface(font); 

XML的列表項佈局:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="30sp" 
/> 

我敢肯定問題出在Adapter.getView(int, View, ViewGroup)方法。我只是不明白要作爲變量傳遞什麼,並嘗試null。但這並不符合我的願望。

如何將Adapter中的TextView的字體更改爲自定義字體?

更新

根據精靈的建議,我創建了一個MenuItemAdapter延伸ArrayAdapter<MenuItem>

public class MenuItemAdapter extends ArrayAdapter<MenuItem> 
{ 
    private Typeface font; 

    public MenuItemAdapter(Context context, int textViewResourceId, List<MenuItem> objects) 
    { 
     super(context, textViewResourceId, objects); 

     font = Typeface.createFromAsset(context.getAssets(), "chantelli_antiqua.ttf"); 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup viewGroup) 
    { 
     ((TextView)view).setTypeface(font); 
     return super.getView(position, view, viewGroup); 
    } 
} 

而且改變了我的Java代碼:

listItemAdapter = new MenuItemAdapter(this, R.layout.listitem, menuItems); 

但現在我的應用程序崩潰後 onCreateListActivity,但在擊中 getView(...)的斷點之前,我還沒有能夠弄清楚爲什麼。任何建議?

UPDATE2

改變了代碼的getView(...)來:

@Override 
public View getView(int position, View view, ViewGroup viewGroup) 
{ 
View v = super.getView(position, view, viewGroup); 
((TextView)v).setTypeface(font); 
return v; 
} 

和工作原理。 :)

+0

[應用自定義字體使用佈局](http://androidtrainningcenter.blogspot.in/2013/07/applying-custom-font-in-entire-android.html) – Sameer 2013-07-12 05:46:27

回答

2

您不應該調用適配器的getView()方法。 ListView爲您做到這一點。您必須擴展ArrayAdapter類並覆蓋getView()方法。在這種方法中,您必須增加一個新視圖或重新使用convertView併爲此視圖設置字體。

+0

這聽起來像一個有希望的答案,但沒有讓我完全到達那裏。請看我更新的問題。提前致謝。 – Bazzz 2011-05-06 12:37:12

+0

管理得到它的工作,感謝您的建議! – Bazzz 2011-05-06 12:50:42

2

我覺得問題出在return super.getView(position, view, viewGroup);的getView()方法結束。 我想應該是這樣的

@Override 
public View getView(int position, View view, ViewGroup viewGroup) 
{ 
    TextView tv = ((TextView)view).setTypeface(font); 
    tv.setText(<String> getItem()); 
    return tv; 
} 

請注意此代碼示例中,我沒有嘗試,但現在我做了定製arrayAdapter之前,它是類似的東西。
這是一個tutorial,它描述瞭如何創建自定義數組適配器。

+0

+1確實,這是解決方案。我設法弄清楚了,不幸的是我之前沒有讀過你的答案。不管怎麼說,還是要謝謝你。 – Bazzz 2011-05-06 12:59:17

+0

我注意到,也需要調用super,否則視圖在我的情況下爲空。 – Bazzz 2011-05-06 13:09:40

+1

是的,你應該檢查如果(視圖== null)在你的getView方法的開始,如果是true,那麼你應該調用findViewById()來獲得你的視圖,然後正常繼續 – Amal 2011-05-06 17:07:40