Пользовательский шрифт в Android ListView
Я использую пользовательский шрифт во всем приложении (кстати, я с сожалением обнаружил, что вы должны применять программно вручную для КАЖДОГО элемента управления!), И мне нужно применить его к списку. Проблема в том, что я не могу видеть, где я установил бы текстовое представление, используемое в шрифте списка, на свой собственный шрифт (как я никогда не создавал его экземпляр - об этом все заботится адаптер).
В идеале мне бы хотелось иметь возможность использовать такой адаптер:
new ArrayAdapter(Context context, TextView textView, List<T> objects)
Таким образом, я мог бы сделать: textView.setTypeface перед заполнением моего списка. Кто-нибудь знает, есть ли способ сделать что-то подобное?
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));
Надеюсь, это поможет вам.
Если вы не хотите создавать новый класс, вы можете переопределить метод getView при создании вашего адаптера, это пример простого адаптера с заголовком и подзаголовком:
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 of Maps
надеюсь, это поможет
Похоже, конструктор не так
измените это на:
public MyAdapter (Context context, List<Object> objects) {
this.context = context;
this.objects = objects;
}
это хорошо сработало для меня.
Попробуйте вот так для 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);
В дополнение к ответу Moisés Olmedo - альтернативный вариант без создания нового класса:
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;
}
});
holder.txt_name.setTypeface(Typeface.createFromAsset(activity.getAssets(), "font/nasimbold.ttf"));
Сначала скопируйте и вставьте файлы шрифтов в папку assets/fonts. Затем определите текстовое представление.
Typeface font=Typeface.createFromAsset(activity.getAssets(), "fonts/<font_file_name>.ttf");
holder.text.setTypeface(font);
holder.text.setText("your string variable here");
Вы можете установить базовый адаптер, как описано ниже. Может помочь вам
Определите свой базовый адаптер
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" в Assets, затем добавьте свой шрифт в папку "Fonts"
затем установить свой адаптер
adapter = new LessonAdapter(LessonsTitle.this, titles);
setListAdapter(adapter);