2011-05-06 15 views
7

Estoy tratando de cambiar la fuente de TextView en mi ArrayAdapter. La fuente chantelli_antiqua.ttf se encuentra en la carpeta de activos.fuente personalizada para textview en ArrayAdapter

Aquí está mi código 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 para el diseño listitem:

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

Estoy seguro el problema radica en el método Adapter.getView(int, View, ViewGroup). Simplemente no entiendo qué pasar como variables e intenté null. Pero esto no hace lo que me gustaría.

Cómo cambiar la fuente del TextView en el Adapter a la fuente personalizada?

actualización

De acuerdo con la sugerencia de Pixie he creado un MenuItemAdapter que se extiende 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); 
    } 
} 

y cambiaron mi código java a:

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

Pero ahora mi aplicación se bloquea después de la onCreate del ListActivity, pero antes de llegar al punto de interrupción en getView(...), no he sido capaz de averiguar aún por qué. ¿Cualquier sugerencia?

Update2

cambiado el código de getView (...) a:

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

y esto funciona. :)

+0

[Aplicación de fuente personalizada utilizando diseños] (http://androidtrainningcenter.blogspot.in/2013/07/applying-custom-font-in-entire-android.html) – Sameer

Respuesta

2

No debe llamar al método getView() de su adaptador. El ListView hace esto por usted. Tienes que extender la clase ArrayAdapter y reemplazar el método getView() en su lugar. En este método, debe inflar una nueva vista o reutilizar convertView y establecer el tipo de letra para esta vista.

+0

Esto suena como una respuesta prometedora pero no lo hizo hazme llegar aún completamente. Por favor mira mi pregunta actualizada Gracias por adelantado. – Bazzz

+0

¡Logramos que funcione, gracias por la sugerencia! – Bazzz

2

Creo que el problema está en return super.getView(position, view, viewGroup); al final del método getView(). creo que debe ser así

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

tenga en cuenta que este código es ejemplo que no lo probamos ahora, pero hice ArrayAdapter personalizado antes y que era algo por el estilo.
Aquí hay un tutorial que describe cómo crear arrayAdapter personalizado.

+0

+1 Cierto, esta es la solución. Me las arreglé para resolverlo también, desafortunadamente no leí tu respuesta antes. gracias de cualquier manera. – Bazzz

+0

Observé que también se necesita una llamada al súper, de lo contrario, la vista es nula en mi caso. – Bazzz

+1

sí, debería verificar si (ver == nulo) al comienzo de su método getView y si es verdadero, entonces debe llamar a findViewById() para obtener su vista y continuar normalmente – Amal

Cuestiones relacionadas