2011-01-02 3 views
9

J'utilise une police personnalisée dans toute mon application (ce qui, incidemment, j'ai découvert avec frustration que vous devez appliquer par programmation à la main pour CHAQUE contrôle!), Et je dois l'appliquer à une liste de lecture. Le problème est que je ne vois pas où je définirais la textview utilisée dans la police de la liste pour ma police personnalisée (comme je ne l'instancie jamais - tout cela est pris en charge par l'adaptateur).police personnalisée dans android ListView

Ce que je idéalement aime est d'être en mesure d'utiliser un adaptateur comme celui-ci:

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

De cette façon, je pouvais faire: textView.setTypeface avant peuplant ma liste. Est-ce que quelqu'un sait s'il existe un moyen de faire quelque chose dans ce sens?

+0

Vous n'avez pas à appliquer par programme à chaque contrôle. Créez simplement un MyFontTextView personnalisé qui étend TextView et définissez le type face dans constructor- cochez la réponse à cela http://stackoverflow.com/questions/2973270/using-a-custom-typeface-in-android – scottyab

Répondre

8

Vous ne pouvez pas le faire de cette façon car la ressource d'affichage de texte que vous transmettez à ArrayAdapter est gonflée chaque fois qu'elle est utilisée.

Vous devez créer votre propre adaptateur et fournir votre propre vue.

Un exemple pour votre adaptateur pourrait être

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; 
} 

}

Et vous pouvez ensuite définir que tel

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

Espérons que vous devriez aller.

+0

Je pensais que cela pourrait faire il, mais espérait qu'il y aurait un moyen plus facile! Merci cependant - devrait être bien à mettre en œuvre! – tiswas

+0

yup - c'est fait le tour, et ce n'était vraiment pas beaucoup de travail! Je vais essayer d'être moins paresseux avant de poser des questions la prochaine fois! – tiswas

2

On dirait que le constructeur est erroné

changement à:

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

cela a bien fonctionné pour moi.

0

Commencez par copier et coller les fichiers de polices dans le dossier assets/fonts. Puis identifiez le textview.

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

Si vous ne voulez pas créer une nouvelle classe, vous pouvez remplacer la méthode getView lors de la création de votre adaptateur, ceci est un exemple d'un simpleAdapter avec le titre et le sous-titre:

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); 

où les articles est votre ArrayList des cartes

espoir qui aide

1

En plus de la réponse de Moisés Olmedo - une autre variante sans créer une nouvelle classe:

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

Vous pouvez définir la base Adapter comme suivre peuvent être vous aider à

Définir votre adaptateur de base

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; 
    } 

} 

par la méthode de TypeFace vous pouvez définir votre police par dossier add « Polices » de l'actif puis ajoutez votre police dans le dossier "Fonts

alors pour définir votre adaptateur

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

Essayez comme ça pour 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(), "police/nasimbold.ttf"));

Questions connexes