2011-01-02 27 views
9

Estoy utilizando una fuente personalizada en toda mi aplicación (que, por cierto, he encontrado frustrantemente que debe aplicar programáticamente a mano a CADA control!), Y tengo que aplicarlo a una vista de lista. El problema es que no puedo ver dónde configuré la vista de texto utilizada en la fuente de la lista en mi fuente personalizada (ya que nunca la instalé, eso es todo lo que hace el adaptador).fuente personalizada en android ListView

Lo que me gusta lo ideal es ser capaz de utilizar un adaptador como este:

new ArrayAdapter(Context context, TextView textView, List<T> objects) 

De esa manera podría hacer: textView.setTypeface antes de ocupar mi lista. ¿Alguien sabe si hay una manera de hacer algo en esta línea?

+0

No tiene que aplicar programáticamente a cada control. Simplemente cree un MyFontTextView personalizado que extienda TextView y establezca el tipo de letra en el constructor. Verifique la respuesta a este http://stackoverflow.com/questions/2973270/using-a-custom-typeface-in-android – scottyab

Respuesta

8

No puede hacerlo de esa manera porque el recurso de vista de texto que pasa al ArrayAdapter se infla cada vez que se usa.

Debe crear su propio adaptador y proporcionar su propia vista.

Un ejemplo para su adaptador podría ser

public class MyAdapter extends BaseAdapter { 

private List<Object>  objects; // obviously don't use object, use whatever you really want 
private final Context context; 

public CamAdapter(Context context, List<Object> objects) { 
    this.context = context; 
    this.objects = objects; 
} 

@Override 
public int getCount() { 
    return objects.size(); 
} 

@Override 
public Object getItem(int position) { 
    return objects.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    Object obj = objects.get(position); 

    TextView tv = new TextView(context); 
    tv.setText(obj.toString()); // use whatever method you want for the label 
    // set whatever typeface you want here as well 
    return tv; 
} 

}

Y entonces se podría establecer que, como tal

ListView lv = new ListView(this); 
lv.setAdapter(new MyAdapter(objs)); 

Esperemos que debe conseguir que ir.

+0

. Pensé que eso podría hacer ¡pero esperaba que hubiera una manera más fácil! Gracias, sin embargo, debería estar bien implementarlo. – tiswas

+0

yup - ¡eso fue lo que hizo, y realmente no fue tanto trabajo! ¡Trataré de ser menos vago antes de hacer preguntas la próxima vez! – tiswas

2

Parece que el constructor está mal

cambio a:

public MyAdapter (Context context, List<Object> objects) { 
    this.context = context; 
    this.objects = objects; 
} 

funcionó bien para mí.

0

Primero copie y pegue los archivos de fuentes en la carpeta assets/fonts. Luego identifique la vista de texto.

Typeface font=Typeface.createFromAsset(activity.getAssets(), "fonts/<font_file_name>.ttf"); 
    holder.text.setTypeface(font); 
    holder.text.setText("your string variable here"); 
10

Si no desea crear una nueva clase puede anular el método getView al crear su adaptador, éste es un ejemplo de un simpleAdapter con título y subtítulo:

Typeface typeBold = Typeface.createFromAsset(getAssets(),"fonts/helveticabold.ttf"); 
Typeface typeNormal = Typeface.createFromAsset(getAssets(), "fonts/helvetica.ttf"); 

SimpleAdapter adapter = new SimpleAdapter(this, items,R.layout.yourLvLayout, new String[]{"title", 
    "subtitle" }, new int[] { R.id.rowTitle, 
    R.id.rowSubtitle }){ 
      @Override 
     public View getView(int pos, View convertView, ViewGroup parent){ 
      View v = convertView; 
      if(v== null){ 
       LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v=vi.inflate(R.layout.yourLvLayout, null); 
      } 
      TextView tv = (TextView)v.findViewById(R.id.rowTitle); 
      tv.setText(items.get(pos).get("title")); 
      tv.setTypeface(typeBold); 
      TextView tvs = (TextView)v.findViewById(R.id.rowSubtitle); 
      tvs.setText(items.get(pos).get("subtitle")); 
      tvs.setTypeface(typeNormal); 
      return v; 
     } 


}; 
listView.setAdapter(adapter); 

donde los artículos es su ArrayList de Mapas

esperanza de que ayuda a

1

Además de la respuesta de Moisés Olmedo - una variante alternativa sin crear una nueva clase:

tf = Typeface.createFromAsset(getAssets(), fontPath); 

    recordsAdapter = new SimpleCursorAdapter(this, R.layout.item1, cursor, from, to); 

    recordsAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      if (columnIndex == 1) { 
       final TextView tv = (TextView) view; 
       tv.setTypeface(tf); 
      } 
      return false; 
     } 
    }); 
0

Puede configurar el adaptador base como siga los pasos le pueden estar ayudan

Definir su adaptador

public class LessonAdapter extends BaseAdapter { 

    private Context mContext; 

    public LessonAdapter(Context mContext, ArrayList<String> titles) { 
     super(); 
     this.mContext = mContext; 
    } 

    public int getCount() { 
     // TODO Auto-generated method stub 
     if (titles!=null) 
      return titles.size(); 
     else 
      return 0; 
    } 

    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View v = convertView; 
     try 
     { 
      if (v == null) { 
       v = inflater.inflate(R.layout.lesson_item, null); 
      } 
       TextView title = (TextView) v.findViewById(R.id.title); 

       Typeface tf = Typeface.createFromAsset(getAssets(), 
         "fonts/Rabiat_3.ttf"); 
       title.setTypeface(tf); 

       title.setText(titles.get(position).toString());  

     } 
     catch (Exception e) { 
      Log.d("searchTest", e.getMessage()); 
     } 

     return v; 
    } 

} 

Base por el Método TypeFace puede establecer la fuente de la carpeta add 'Fuentes' en el Activo a continuación, añadir su fuente en la carpeta 'Fuentes'

a continuación para configurar su adaptador

adapter = new LessonAdapter(LessonsTitle.this, titles); 
    setListAdapter(adapter); 
2

Intenta así por arrayadapters ::

Typeface typeNormal = Typeface.createFromAsset(getAssets(), "roboto_lite.ttf"); 

timearray = new ArrayAdapter<String>(DetailsActivity.this,R.layout.floorrow,R.id.txt, flor) { 
    public View getView(int pos, View convertView, android.view.ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.floorrow, null); 
     } 
     TextView tv = (TextView)v.findViewById(R.id.txt); 
     tv.setText(flor.get(pos)); 
     tv.setTypeface(typeNormal); 
     return v; 
    }; 
}; 

lv_building.setAdapter(timearray); 
0

holder.txt_name.setTypeface (Typeface.createFromAsset (activity.getAssets() "la fuente/nasimbold.ttf"));

Cuestiones relacionadas