1

私は以下のコードを実行しています:

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"/>

私はこのように設定しています:

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

すべて正常に動作します。今、プログラムでカスタム フォント .ttf をヘッダーとセクションに追加する必要があります。その方法を教えてください。

4

1 に答える 1

3

あなたのgetView方法では、次の行を置き換えることができます

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

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

WheremyTypeFaceは型のメンバーでありTypeFace、次のようにコンストラクターにロードされています。

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

これにより、配置されたフォントがassets/fonts/myFont.ttfテキスト ビューに割り当てられます。ただし、アプリの他の場所でフォントが必要な場合は、おそらくアダプターに配置するのではなく、カスタム フォント マネージャーなどからロードする必要があることに注意してください。これは、Android の古いバージョンではフォントがキャッシュされないためcreateFromAssetです。これにより、不必要なメモリ消費が発生します。

于 2013-04-11T18:33:10.227 に答える