我正在尝试找到一种方法来使用SectionIndexer
,而不是AlphabetIndexer
。我感兴趣的是在节标题上使用字符串数组的元素而不是字母表。我无法使用节索引器找到任何示例代码。
以下是AlphabetIndexer
的示例代码:
private AlphabetIndexer indexer;
indexer = new AlphabetIndexer(c, c.getColumnIndexOrThrow(
DbHelper.COUNTRIES_NAME),"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
是否可以将stringArray
代替“ABCDEFGHIJKLMNOPQRSTUVWXYZ”传递给AlphabetIndexer
,以便我可以代替“A”,“B”,......“Z”作为标题“书”,“食物”,......在标题上?
如果不是最好的方法是什么?对使用SectionIndexer
而不是AlphabetIndexer
的示例代码的任何引用也会有所帮助。
感谢您的帮助。 TJ
答案 0 :(得分:12)
您可以尝试编写自定义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类是标题,副标题和布尔值的简单容器,用于判断它是否为节标题。
这不是编写此适配器的唯一方法,但我希望这会有所帮助。