9.1 问题
需要创建一个有若干节内容的列表,其中每一节的顶部都有各自的头部。
9.2 解决方案
(API Level 1)
我们可以通过构建自定义列表适配器来实现此效果,此适配器利用了对多种视图类型的支持。适配器依赖getViewTypeCount()和getItemViewType()来确定将多少种视图用作列表中的行。在大多数情况下,如果所有的行类型相同,就忽略上述方法。然而,在此可以使用这些方法回调为头部行和内容行定义独特的类型。
9.3 实现机制
下图显示了带有节头部的示例列表的预览效果。
我们首先在以下代码中定义SectionItem数据结构,用于表示列表中的每一节。此项将保存节标题以及此标题下列出的数据数组子集。
包含每一节数据的结构
public class SectionItem<T> {
private String mTitle;
private T[] mItems;
public SectionItem(String title, T[] items) {
if (title == null) title = "";
mTitle = title;
mItems = items;
}
public String getTitle() {
return mTitle;
}
public T getItem(int position) {
return mItems[position];
}
public int getCount() {
//为节标题包含额外的项
return (mItems == null ? 1 : 1 + mItems.length);
}
@Override
public boolean equals(Object object) {
//如果两个节有相同的标题,则它们相等
if (object != null && object instanceof SectionItem) {
return ((SectionItem) object).getTitle().equals(mTitle);
}
return false;
}
}
此结构将使列表适配器中的逻辑更易于管理。在以下代码中,我们可以看到提供分节列表视图的适配器。此适配器的任务是将每个节项(包括它们的头部)的位置映射到适配器视图(如ListView)所了解的可见列表的全局位置。
用于显示多个节的ListAdapter
public abstract class SimpleSectionsAdapter<T> extends BaseAdapter implements AdapterView.OnItemClickListener {
/* 为每个视图类型定义常量 */
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private LayoutInflater mLayoutInflater;
private int mHeaderResource;
private int mItemResource;
/* 所有节的唯一聚合*/<