Android: как использовать SectionIndexer

Я пытаюсь найти способ использовать SectionIndexer вместо AlphabetIndexer. Мне интересно, чтобы в элементе заголовков вместо алфавитов были элементы строковых массивов. Я не смог найти какой-либо пример кода с помощью индексатора раздела.

Вот пример кода для AlphabetIndexer:

private AlphabetIndexer indexer;
indexer = new AlphabetIndexer(c, c.getColumnIndexOrThrow(
   DbHelper.COUNTRIES_NAME),"ABCDEFGHIJKLMNOPQRSTUVWXYZ");

Можно ли передать stringArray вместо "ABCDEFGHIJKLMNOPQRSTUVWXYZ" в AlphabetIndexer, чтобы я мог, например, вместо "A", "B",... "Z" в качестве заголовка иметь "Book", "Еда",... на заголовках?

Если это не лучший способ сделать это? Любая ссылка на пример кода, который использует SectionIndexer вместо AlphabetIndexer, также будет полезен.

Спасибо за помощь. TJ

Ответ 1

Вы можете попытаться написать пользовательский ArrayAdapter и в основном вернуть представление заголовка раздела в методе getView(...) для позиций, где должны отображаться заголовки.

Вам также потребуется перезаписать getViewTypeCount (), чтобы вернуть число новых типов представлений (в этом случае 2) и getItemViewType (int position), чтобы вернуть тип представления для текущей позиции.

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

Это мой настраиваемый адаптер массива:

public class ItemListAdapter extends ArrayAdapter<ModelItem>
{
    private static final int    TYPE_SECTION_HEADER = 0;
    private static final int    TYPE_LIST_ITEM  = 1;

    int mDefaultRowLayoutResID;
    Context mContext;
    LayoutInflater mInflater;
    ArrayList<ModelItem> lItems;

    public ItemListAdapter(Context context, int resource, ArrayList<ModelItem> items)
    {
        super(context, resource, items);
        mContext = context;
        mResource = resource;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        lItems = items;
    }

    @Override
    public ModelItem getItem(int position)
    {
        return lItems.get(position);
    }

    @Override
    public int getCount()
    {
        return lItems.size();
    }

    @Override
    public int getViewTypeCount()
    {
        return 2;
    }

    @Override
    public int getItemViewType(int position)
    {
        ModelItem item = lItems.get(position);
        if (item.isHeader())
        {
            return TYPE_SECTION_HEADER;
        }
        else
        {
            return TYPE_LIST_ITEM;
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder;
        ModelItem item = getItem(position);

        if (convertView == null)
        {
            if (item.isHeader())
            {
                convertView = mInflater.inflate(R.layout.row_item_section_header, null);
                holder = new ViewHolder();
                holder.title = (TextView)convertView.findViewById(R.id.list_header_title);
                holder.subtitle = null;
                convertView.setTag(holder);
            }
            else
            {
                convertView = mInflater.inflate(R.layout.row_item_default, null);
                holder = new ViewHolder();
                holder.title = (TextView)convertView.findViewById(R.id.row_item_title);
                holder.subtitle = (TextView)convertView.findViewById(R.id.row_item_subtitle);
                convertView.setTag(holder);
            }
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.title.setText(item.getTitle());
        if (holder.subtitle != null)
        {
            holder.subtitle.setText(item.getSubtitle());
        }
        return convertView;
    }

    private class ViewHolder
    {
        public TextView title;
        public TextView subtitle;
        public ImageView leftIcon;
        public View rightControl;
    }
}

Это файл row_item_default.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <TextView
        android:id="@+id/row_item_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    />
    <TextView
        android:id="@+id/row_item_subtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/row_item_title"
    />
</RelativeLayout>

и это row_item_section_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"
    style="?android:attr/listSeparatorTextViewStyle"
/>

Класс ModelItem представляет собой простой контейнер для заголовка, субтитров и логических значений, чтобы определить, является ли он заголовком раздела или нет.

Это не единственный способ написать этот адаптер, но я надеюсь, что это поможет.