2011-01-02 5 views
9

Я использую собственный шрифт во всей своей программе (что, кстати, я расстроен, что вам нужно применять программно вручную для КАЖДОГО элемента управления!), И мне нужно применить его к список. Проблема в том, что я не вижу, где бы я установил текстовое представление, используемое в шрифте списка, для моего пользовательского шрифта (поскольку я никогда не создавал его экземпляр - это все позаботится адаптер).пользовательский шрифт в android ListView

Что я бы в идеале хотелось, чтобы иметь возможность использовать адаптер, как это:

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

Таким образом, я мог бы сделать: textView.setTypeface, прежде чем заселять мой список. Кто-нибудь знает, есть ли способ сделать что-то в этом направлении?

+0

Вам не нужно применять программно к каждому элементу управления. Просто создайте пользовательский MyFontTextView, который расширяет TextView и устанавливает тип лица в конструкторе. Проверьте ответ на этот http://stackoverflow.com/questions/2973270/using-a-custom-typeface-in-android. – scottyab

ответ

8

Вы не можете этого сделать, потому что ресурс текстового вида, передаваемый в ArrayAdapter, накачивается каждый раз, когда он используется.

Вам необходимо создать свой собственный адаптер и предоставить свой собственный вид.

Пример для вашего адаптера может быть

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

}

И тогда вы могли бы установить, что в качестве такого

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

Будем надеяться, что вы должны получить идти.

+0

. Я думал, что это возможно. он, но надеялся, что будет более простой способ! Спасибо, хотя - должно быть хорошо, чтобы реализовать! – tiswas

+0

yup - это было трюк, и на самом деле это было не так много! Я постараюсь быть менее ленивым, прежде чем задавать вопросы в следующий раз! – tiswas

2

Похоже, конструктор неправильно

изменить его:

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

он работал хорошо для меня.

0

Сначала скопируйте и вставьте файлы шрифтов в папку «Ресурсы/шрифты». Затем укажите текст.

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

Если вы не хотите, чтобы создать новый класс, который вы можете переопределить метод GetView при создании адаптера, это пример simpleAdapter с заголовком и подзаголовком:

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

где товар ваш ArrayList Карт

надежда, что помогает

1

В дополнение к ответу на Moisés Альмедо - альтернативный вариант без создания нового класса:

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

Вы можете установить базовый адаптер, как следовать шаги Может помочь вам

Определите базовый адаптер

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

} 

по методу Typeface вы можете установить шрифт, добавить папку «Fonts» в активах затем добавить шрифт в папку «Fonts»

затем установить адаптер

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

Попробуйте, как это для 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(), "шрифт/nasimbold.ttf"));

Смежные вопросы