下面写怎么让每个首字母相同的联系人归类展示:
在adapter implement SectionIndexer
这样adapter里必须实现以下3个接口:
@Override
public Object[] getSections() { //section的集合
}
@Override
public int getPositionForSection(int section) {//当前section的位置
}
@Override
public int getSectionForPosition(int position) {//当前position的section信息
}
所以我们必须把取到的本地联系人的数据进行加工
定义一个来存储section的信息:
private class SectionTitle{
public String title;
public SectionTitle(){
title = "";
}
public String toString(){
return title;
}
}
定义以下结构来获取实现sectionIndexer所要的信息:
private class ContactSectionMapper implements SectionIndexer {
private SectionTitle[] mSections = null;
private SparseIntArray mSectionPositionMap = null;
private SparseIntArray mPositionSectionMap = null;
public ContactSectionMapper(SectionTitle[] sectionDatas) {
mSections = sectionDatas;
}
public void changeData(SparseIntArray sectionPositionMap, SparseIntArray positionSectionMap) {
mSectionPositionMap = sectionPositionMap;
mPositionSectionMap = positionSectionMap;
}
@Override
public Object[] getSections() {
return mSections;
}
/**
* 找出这个section对应的position
*/
@Override
public int getPositionForSection(int section) {
if (mSectionPositionMap == null)
return -1;
if (section == 0)
return -1;
return mSectionPositionMap.get(section, -1);
}
/**
* 找出这个position对应的section
*/
@Override
public int getSectionForPosition(int position) {
if (mPositionSectionMap == null)
return -1;
if (position <= 0)
return 0;
return mPositionSectionMap.get(position, -1);
}
/**
* @param position
* @return
*/
public boolean isSection(int position) {
if (position == 0)
return true;
int sectionIdx = getSectionForPosition(position);
int sectionPosition = getPositionForSection(sectionIdx);
if (sectionIdx == -1 && sectionPosition == -1)
return false;
return (position == sectionPosition);
}
public String getSection(int position) {
if (mSections == null)
return NONE_ENGLISH_LETTER_TITLE;
int sectionIndex = getSectionForPosition(position);
if (sectionIndex < 0 || sectionIndex >= mSections.length)
return NONE_ENGLISH_LETTER_TITLE;
return mSections[sectionIndex].toString();
}
}
在adapter里面我们重载changeCursor(每次cursor改变都会调用)这个方法,进行加工,取出数据的首字母信息
<span style="white-space:pre"> </span>@Override
public void changeCursor(Cursor c) {
processCursor(c);
super.changeCursor(c);
}
private void processCursor(Cursor c) {
/** define some variables */
SparseIntArray sectionPositionMap = new SparseIntArray();
SparseIntArray positionSectionMap = new SparseIntArray();
for(int i = 0; i < mSectionDatas.length; i++){
mSectionDatas[i].title = "";
}
if (c == null || c.getCount() == 0 || c.isClosed()){
mSectionMapper.changeData(sectionPositionMap, positionSectionMap);
return;
}
String curtitle = "";
int i = 0;
int position = 0;
while (c.moveToNext()) {
position = c.getPosition();
String curLetter = getTitle(getDisplayName(c));
//看看当前的名字的第一个名字是什么,是不是section的开头
if (TextUtils.isEmpty(curtitle) || !TextUtils.equals(curLetter, curtitle)) {
mSectionDatas[i].title = curLetter;
//这个当前的名字是section的开头
sectionPositionMap.put(i, position);
curtitle = curLetter;
i++;
}
positionSectionMap.put(position, i - 1);
}
for(; i < mSectionDatas.length; i++){
mSectionDatas[i].title = curtitle;
sectionPositionMap.put(i, position);
}
mSectionMapper.changeData(sectionPositionMap, positionSectionMap);
}
在adapter的初始化里面:
protected final class ContactsAdapter extends ResourceCursorAdapter implements SectionIndexer,OnScrollListener {
protected boolean mLoading = true;
private ContactSectionMapper mSectionMapper = null;
private SectionTitle[] mSectionDatas = null;
private static final int SECTION_COUNT = 27;
public ContactsAdapter(Context context) {
super(context, R.layout.contacts_list_item_photo,null);
mSectionDatas = new SectionTitle[SECTION_COUNT];
for (int i = 0; i < SECTION_COUNT; i++) {
mSectionDatas[i] = new SectionTitle();
}
mSectionMapper = new ContactSectionMapper(mSectionDatas);
}
<span style="white-space:pre"> </span>@Override
public Object[] getSections() {
return mSectionMapper.getSections();
}
@Override
public int getPositionForSection(int section) {
return mSectionMapper.getPositionForSection(section);
}
@Override
public int getSectionForPosition(int position) {
return mSectionMapper.getSectionForPosition(position);
}
效果图: