2011-05-06 77 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

相关问题