1

i have the code below running:

public class SeparatedListAdapter extends BaseAdapter
    {
        public final Map<String, Adapter> sections = new LinkedHashMap<String, Adapter>();
        public final ArrayAdapter<String> headers;
        public final static int TYPE_SECTION_HEADER = 0;

        public SeparatedListAdapter(Context context)
            {
                headers = new ArrayAdapter<String>(context, R.layout.list_header);
            }

        public void addSection(String section, Adapter adapter)
            {
                this.headers.add(section);
                this.sections.put(section, adapter);
            }

        @Override
        public Object getItem(int position)
            {
                for (Object section : this.sections.keySet())
                    {
                        Adapter adapter = sections.get(section);
                        int size = adapter.getCount() + 1;

                        // check if position inside this section
                        if (position == 0) {
                            return section;
                        }
                        if (position < size) {
                            return adapter.getItem(position - 1);
                        }

                        // otherwise jump into next section
                        position -= size;
                    }
                return null;
            }

        @Override
        public int getCount()
            {
                // total together all sections, plus one for each section header
                int total = 0;
                for (Adapter adapter : this.sections.values()) {
                    total += adapter.getCount() + 1;
                }
                return total;
            }

        @Override
        public int getViewTypeCount()
            {
                // assume that headers count as one, then total all sections
                int total = 1;
                for (Adapter adapter : this.sections.values()) {
                    total += adapter.getViewTypeCount();
                }
                return total;
            }

        @Override
        public int getItemViewType(int position)
            {
                int type = 1;
                for (Object section : this.sections.keySet())
                    {
                        Adapter adapter = sections.get(section);
                        int size = adapter.getCount() + 1;

                        // check if position inside this section
                        if (position == 0) {
                            return TYPE_SECTION_HEADER;
                        }
                        if (position < size) {
                            return type + adapter.getItemViewType(position - 1);
                        }

                        // otherwise jump into next section
                        position -= size;
                        type += adapter.getViewTypeCount();
                    }
                return -1;
            }

        public boolean areAllItemsSelectable()
            {
                return false;
            }

        @Override
        public boolean isEnabled(int position)
            {
                return (getItemViewType(position) != TYPE_SECTION_HEADER);
            }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
            {
                int sectionnum = 0;
                for (Object section : this.sections.keySet())
                    {
                        Adapter adapter = sections.get(section);
                        int size = adapter.getCount() + 1;

                        // check if position inside this section
                        if (position == 0) {
                            return headers.getView(sectionnum, convertView, parent);
                        }
                        if (position < size) {
                            return adapter.getView(position - 1, convertView, parent);
                        }

                        // otherwise jump into next section
                        position -= size;
                        sectionnum++;
                    }
                return null;
            }

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

    }

HEADER.xml

<!-- list_header.xml -->
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_header_title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingTop="2dip"
    android:paddingBottom="2dip"
    android:paddingLeft="5dip"
    android:textSize="20sp"
    style="?android:attr/listSeparatorTextViewStyle" />

LIST_ITEM.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- list_item.xml -->
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_item_title"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="15dip"
    android:paddingBottom="15dip"
    android:paddingLeft="15dip"
    android:textSize="24sp"/>

i am setting like this:

adapter.addSection(header, new ArrayAdapter<String>(this, R.layout.list_item, array));

All works fine. Now I need to progrmatically add custom fonts .ttf to the header and sections how to do it?

Ye Lin Aung
  • 11,234
  • 8
  • 45
  • 51
Goofy
  • 6,098
  • 17
  • 90
  • 156
  • To use font files on TextViews in xml I use the answer to the following post. http://stackoverflow.com/questions/8504431/how-to-use-font-file – draksia Apr 11 '13 at 18:24
  • No i want to add it to the current working model. – Goofy Apr 11 '13 at 18:26
  • Sorry misread, if you want to want to do it programmatically, you need to retrieve the `TextView` object from the header and from the `ArrayAdapter` and then set the font for each one. My advice would be really not use an underlying `ArrayAdapter` and build your `Adapter` that inflates a `TextViewPlus`. – draksia Apr 11 '13 at 18:30
  • @draksia thanks for your reply , how to do it can you please help? – Goofy Apr 11 '13 at 18:32

1 Answers1

3

In your getView method you can replace the following lines

if (position == 0) {
    return headers.getView(sectionnum, convertView, parent);
}
if (position < size) {
    return adapter.getView(position - 1, convertView, parent);
}

with

View view = null;
if (position == 0) {
    view = headers.getView(sectionnum, convertView, parent);
    if(view != null) {
        TextView text = (TextView) view.findViewById(R.id.list_header_title);
        if(text != null) {
            text.setTypeface(myTypeface);
        }
    }
    return view;
}
if (position < size) {
    view = adapter.getView(position - 1, convertView, parent);
    TextView text = (TextView) view.findViewById(R.id.list_item_title);
    if(view != null) {
        if(text != null) {
            text.setTypeface(myTypeface);
        }
    }
    return view;
}

Where myTypeFace is a member of type TypeFace and is being loaded in the constructor as follows:

private TypeFace myTypeFace = null;    

public SeparatedListAdapter(Context context)
{
    headers = new ArrayAdapter<String>(context, R.layout.list_header);
    myTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/myFont.ttf");
}    

This will assign the font placed in assets/fonts/myFont.ttf to your text views. However you should note that if you need the font in other places in your app, you should probably not put it in the adapter, but load it from a custom font manager or something, because older versions of android will not cache the font when createFromAsset is called and this will result in unnecessary memory consumption.

Thrakbad
  • 2,728
  • 3
  • 23
  • 31
  • it says The method findViewById(int) is undefined for the type SeparatedListAdapter – Goofy Apr 11 '13 at 18:37
  • 1
    oh sorry, it needs to be `view.findViewById(...)` of course, edited the answer – Thrakbad Apr 11 '13 at 18:38
  • oh ok i will correct it , please wait i will check and let you know – Goofy Apr 11 '13 at 18:41
  • dude how to use this here? because Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf"); it says getAssests() is not there – Goofy Apr 11 '13 at 18:43
  • Man I really shouldn't write code without the IDE, sorry. It needs to be `context.getAssets()` – Thrakbad Apr 11 '13 at 18:44
  • yes correct, but i dont have a context here thats the problem, sorry if i am disturbing you – Goofy Apr 11 '13 at 18:45
  • you have it in the `SeparatedListAdapter` constructor: `public SeparatedListAdapter(Context context)` – Thrakbad Apr 11 '13 at 18:46
  • Thanks a lot buddy, i have one more problem can you please help me on that? – Goofy Apr 11 '13 at 18:49
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/28054/discussion-between-goofy-and-thrakbad) – Goofy Apr 11 '13 at 18:53