默认创建好联系人显示列表;
1,在主页activity_main添加新的listview;
<ListView
Android:divider="@null"
android:id="@+id/lv_sections"
android:layout_width="18dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
2,在mainactivity中关联此listview;
并且声明一个string类型的数组sections,用来装之后获取到的分类字母;
3,声明一个Arrayadapter;
sectionAdapter = new ArrayAdapter<String>(this,android. R.layout.simple.item, sections);
4,在 baseadapter的继承子类中实现sectionindexer;
public class ContactAdapter extends BaseAdapter implements SectionIndexer
在该类中重写接口的方法
int ch = getSectionForPosition(position);//获得当前位置的拼音首字母是啥,这些方法是实现接口sectionindexer
// 获取该首字母应该出现的位置
int pos = getPositionForSection(ch);//再找到上面找到的首字母是在第几位首次出现的;
// 对比
if (position == pos) {
tvSection.setVisibility(View.VISIBLE);
} else {
tvSection.setVisibility(View.GONE);
}
// 5. 返回模版View对象
return convertView;//此时完成相同首字母的名字在同一个大写字母分类条目下;
}
// section:分类字母
// position:位置
@Override
public int getSectionForPosition(int position) {//重写的方法,在position位置处获取首字母
// 获取某个位置(position)的数据对应的分类字母(section)
return contacts.get(position).getPinyin().toUpperCase(Locale.CHINA).charAt(0);//char类型=int;
}
@Override
public int getPositionForSection(int section) {
// 获取某个分类字母(section)应该出现的位置(position)
// 循环整个数据的集合:遍历
for (int i = 0; i < contacts.size(); i++) {
// 在循环过程中,取出当前循环到的数据的首字母
// int ch =
// contacts.get(i).getPinyin().toUpperCase(Locale.CHINA).charAt(0);
int ch = getSectionForPosition(i);//获取i位置的分类条目大写字母是啥
// 与参数传入的section参数进行对比
if (ch == section) {
// 如果是相同的,则意味着找到了,停止继续向后查找
return i;
}
}
return NO_SUCH_SECTION; // 该字母在列表中不存在,返回一个找不到的位置
}
public static final int NO_SUCH_SECTION = -1;
@Override
public Object[] getSections() {//让侧边栏只显示出现的分类字母
// 准备List集合,用于保存所有应该出现的分类字母
List<String> list = new ArrayList<String>();
// 遍历所有联系人,将每个联系人的分类字母添加到集合中
for (int i = 0; i < contacts.size(); i++) {
// 取出分类字母 -> 'A' -> 65
int section = getSectionForPosition(i);
// 将分类字母转为字符串 -> "A"
String str = (char)section + "";
// 检查被添加的字母在集合中是否已经存在
if (!list.contains(str)) {
// 将分类字母添加到集合中
list.add(str);
}
}
// 创建数组
String[] sections = new String[list.size()];
// 将集合中的分类字母全部添加到数组中
for (int i = 0; i < list.size(); i++) {
sections[i] = list.get(i);
}
// 返回数组
return sections;
}
5,在mainactivity中获取侧边栏的字母,之后承接arrayadapter;
sections = (String[]) contactAdapter.getSections();//获取侧边栏要显示的字母数组并且将objects强转为String类
6,为侧边栏设置item监听器,
监听器内的方法为:
public void onItemClick(AdapterView<?> parent, // 点的哪个ListView的Item
View view, // 点的哪个Item
int position, // 点的是第??个Item
long id // 无视
) {
// 点的是哪个字母
String str = sections[position]; // "D"获取当前点击的字母
// 得到char类型的字母,为int类型
int section = str.charAt(0); // char类型的字母'D'
// 点的字母对应的位置
int pos = contactAdapter.getPositionForSection(section);
// 判断该位置是否合法,即:该字母在数据列表中是否存在
if (pos != ContactAdapter.NO_SUCH_SECTION) {
// 联系人列表的ListView快速定位到某个位置
lvContacts.setSelection(pos);
}