ArrayAdapter中TextView的自定义字体

7

我想要在我的ArrayAdapter中改变TextView的字体。字体chantelli_antiqua.ttf在assets文件夹中。

这是我的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);

用于listitem布局的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 字体更改为自定义字体?
更新
根据 Pixie 的建议,我创建了一个扩展了 ArrayAdapter<MenuItem>MenuItemAdapter
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);

但是现在我的应用程序在ListActivityonCreate之后崩溃,但在达到getView(...)中的断点之前,我还没有弄清楚原因。有什么建议吗?

更新2

getView(...)的代码更改为:

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

这很有效。:)


使用布局应用自定义字体 - Tofeeq Ahmad
2个回答

2

您不应该调用适配器的getView()方法。 ListView会为您执行此操作。 您必须扩展ArrayAdapter类并覆盖getView()方法。 在此方法中,您必须填充新视图或重新使用convertView并为此视图设置字体。


这听起来像是一个有前途的答案,但还没有完全解决我的问题。请查看我更新的问题。提前致谢。 - Bazzz

2

我认为问题出在getView()方法的结尾处的return super.getView(position, view, viewGroup);。我认为应该像这样:

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

请注意,这段代码只是示例,我现在还没有尝试过,但我之前制作过自定义的arrayAdapter,大致就是这样的。
这里有一个教程描述如何创建自定义的arrayAdapter:tutorial

+1 确实,这就是解决方案。我也设法弄清楚了,不幸的是在看到你的答案之前我没有阅读它。无论如何,还是谢谢。 - Bazzz
我注意到还需要调用super,否则在我的情况下视图为空。 - Bazzz
1
是的,你应该在你的getView方法开始处检查if(view == null),如果为真,则应调用findViewById()来获取你的视图,然后继续正常操作。 - Amal
这在我的情况下根本不起作用,而getItem()需要一个位置值。 - Shane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接