пользовательский шрифт в Android ListView - PullRequest
9 голосов
/ 02 января 2011

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

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

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

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

Ответы [ 8 ]

9 голосов
/ 16 ноября 2012

Если вы не хотите создавать новый класс, вы можете переопределить метод 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

надеюсь, что помогает

8 голосов
/ 02 января 2011

Вы не можете сделать это таким образом, поскольку ресурс текстового представления, передаваемый в 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));

Надеюсь, это поможет вам.

2 голосов
/ 16 октября 2013

Попробуйте вот так для 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);
2 голосов
/ 07 июля 2011

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

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

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

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

1 голос
/ 03 марта 2013

В дополнение к ответу 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;
        }
    });
0 голосов
/ 04 июня 2015

holder.txt_name.setTypeface (Typeface.createFromAsset (activity.getAssets (), "font / nasimbold.ttf"));

0 голосов
/ 02 сентября 2013

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

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

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);
0 голосов
/ 13 февраля 2012

Сначала скопируйте и вставьте файлы шрифтов в папку assets / fonts. Затем определите текстовое представление.

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