custom font for textview in ArrayAdapter

I'm trying to change the font of a TextView in my ArrayAdapter . The font chantelli_antiqua.ttf is in the assets folder.

Here is my Java code:

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 for the listitem layout:

<?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"
/>

I'm quite sure the problem lies with the Adapter.getView(int, View, ViewGroup) method. I just don't really understand what to pass as variables and tried null . But this doesn't do what I would like it to.

How to change the font of the TextView in the Adapter to the custom font?

Update

According to Pixie's suggestion I created a MenuItemAdapter which extends 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);
    }
}

And changed my java code to:

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

But now my app crashes after the onCreate of the ListActivity , but before hitting the breakpoint in getView(...) , I haven't been able to figure out yet why. Any suggestion?

Update2

Changed the code for getView(...) to:

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

and this works. :)


You shouldn't call the getView() method of your adapter. The ListView does this for you. You have to extend the ArrayAdapter class and override the getView() method instead. In this method you have to inflate a new view or re-use convertView and set the typeface for this view.


I think the problem is in return super.getView(position, view, viewGroup); at the end of getView() method. I think it should be like this

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

please note this code is example I didn't try it now but I made custom arrayAdapter before and it was something like that.
Here is a tutorial describing how to create custom arrayAdapter.

链接地址: http://www.djcxy.com/p/52584.html

上一篇: 在GitHub API中获取用户的组织存储库

下一篇: ArrayAdapter中textview的自定义字体