package com.duguang.baseanimation.ui.listivew.indexlistview;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentResolver;
import android.content.Context;
import android.database.CharArrayBuffer;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.net.Uri;
import android.os.Bundle;
import android.widget.AlphabetIndexer;
import android.widget.ListAdapter;
import android.widget.SectionIndexer;
import android.widget.SimpleAdapter;
/**
* AlphabetIndexer,实现了SectionIndexer接口,是adapter的一个辅助类,辅助实现在快滑时,显示索引字母。
* 使用字母索引的话,必须保证数据列表是按字母顺序排序,以便AlphabetIndexer采用二分查找法快速定位。
* @author Administrator
*/
class IndexAdapter extends SimpleAdapter implements SectionIndexer{
private AlphabetIndexer alphabetIndexer;
/**
* @param context 上下文
* @param data ListView中的数据
* @param resource ListView中条目的资源id
* @param from Map集合中的键
* @param to 条目中子控件的id组成的集合
*/
public IndexAdapter(Context context,List<? extends Map<String, ?>> data, int resource,String[] from, int[] to) {
super(context, data, resource, from, to);
//设置数据游标
//设置索引字母列表
/**
* Cursor表示数据游标
* sortedColumnIndex按字母索引的游标中的列号
* alphabet字母列表,用的最多的是"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
*/
alphabetIndexer = new AlphabetIndexer(new IndexCursor(this), 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
}
/**
* 返回构造函数中指定的由字母构成的区段数组。
*/
@Override
public Object[] getSections() {
return alphabetIndexer.getSections();
}
/**
* 执行二进制检索或查找索引来找出匹配给定节首字母的第一行数据
* @param sectionIndex 要检索的节索引
*/
@Override
public int getPositionForSection(int section) {
return alphabetIndexer.getPositionForSection(section);
}
/**
* 节索引.如果 position 越界,返回的节索引必须在节数组大小范围内
* position 要查找的列表位置
*/
@Override
public int getSectionForPosition(int position) {
return alphabetIndexer.getSectionForPosition(position);
}
/**
* 伪装一个Cursor供AlphabetIndexer作数据索引源
*/
private class IndexCursor implements Cursor{
private ListAdapter adapter;
private int position;
private Map<String, String> map;
public IndexCursor(ListAdapter adapter){
this.adapter = adapter;
}
@Override
public int getCount() {return this.adapter.getCount();}
/**
* 取得索引字母,这个方法非常重要,根据实际情况具体处理
*/
@SuppressWarnings("unchecked")
@Override
public String getString(int columnIndex) {
map = (HashMap<String, String>)adapter.getItem(position);
return map.get("itemText").substring(0,1);
}
@Override
public boolean moveToPosition(int position) {
if(position<-1||position>getCount()){
return false;
}
this.position = position;
//如果不满意位置有点向上偏的话,下面这几行代码是修复定位索引值为顶部项值的问题
//if(position+2>getCount()){
// this.position = position;
//}else{
// this.position = position + 2;
//}
return true;
}
@Override
public int getPosition() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean move(int offset) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean moveToFirst() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean moveToLast() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean moveToNext() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean moveToPrevious() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isFirst() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isLast() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isBeforeFirst() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAfterLast() {
// TODO Auto-generated method stub
return false;
}
@Override
public int getColumnIndex(String columnName) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getColumnIndexOrThrow(String columnName)
throws IllegalArgumentException {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getColumnName(int columnIndex) {
// TODO Auto-generated method stub
return null;
}
@Override
public String[] getColumnNames() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return 0;
}
@Override
public byte[] getBlob(int columnIndex) {
// TODO Auto-generated method stub
return null;
}
@Override
public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {
// TODO Auto-generated method stub
}
@Override
public short getShort(int columnIndex) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getInt(int columnIndex) {
// TODO Auto-generated method stub
return 0;
}
@Override
public long getLong(int columnIndex) {
// TODO Auto-generated method stub
return 0;
}
@Override
public float getFloat(int columnIndex) {
// TODO Auto-generated method stub
return 0;
}
@Override
public double getDouble(int columnIndex) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getType(int columnIndex) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isNull(int columnIndex) {
// TODO Auto-generated method stub
return false;
}
@Override
public void deactivate() {
// TODO Auto-generated method stub
}
@Override
@Deprecated
public boolean requery() {
// TODO Auto-generated method stub
return false;
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public boolean isClosed() {
// TODO Auto-generated method stub
return false;
}
@Override
public void registerContentObserver(ContentObserver observer) {
// TODO Auto-generated method stub
}
@Override
public void unregisterContentObserver(ContentObserver observer) {
// TODO Auto-generated method stub
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
}
@Override
public void setNotificationUri(ContentResolver cr, Uri uri) {
// TODO Auto-generated method stub
}
@Override
public boolean getWantsAllOnMoveCalls() {
// TODO Auto-generated method stub
return false;
}
@Override
public Bundle getExtras() {
// TODO Auto-generated method stub
return null;
}
@Override
public Bundle respond(Bundle extras) {
// TODO Auto-generated method stub
return null;
}
}
}