通讯录Index

来源:互联网 发布:曹雪松淘宝技术总监 编辑:程序博客网 时间:2024/06/18 01:35

自定义View:


public class SideBarView extends View{private OnTouchingLetterChangedListener mOnTouchingLetterChangedListener;private String[] index = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K","L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X","Y", "Z","#" };private int choose = -1;private Paint paint = new Paint();private boolean isShowBg = false;public SideBarView(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);}public SideBarView(Context context, AttributeSet attrs){super(context, attrs);}public SideBarView(Context context){super(context);}@Overrideprotected void onDraw(Canvas canvas){super.onDraw(canvas);if (isShowBg){canvas.drawColor(Color.parseColor("#40000000"));}int height = getHeight();int width = getWidth();Log.d("SideBarView", "with="+width+":height="+height);//每一个字母的高度int singleHeight = height / index.length;for (int i = 0; i < index.length; i++){paint.setColor(Color.WHITE);paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setAntiAlias(true);if (i == choose){paint.setColor(Color.parseColor("#3399ff"));paint.setFakeBoldText(true);}float xPos = width / 2 - paint.measureText(index[i]) / 2;float yPos = singleHeight * i + singleHeight;canvas.drawText(index[i], xPos, yPos, paint);paint.reset();}}@Overridepublic boolean dispatchTouchEvent(MotionEvent event){final int action = event.getAction();final float y = event.getY();final int oldChoose = choose;final OnTouchingLetterChangedListener listener = mOnTouchingLetterChangedListener;final int c = (int) (y / getHeight() * index.length);Log.d("SideBarView", "c="+c+":y="+y+":getHeight()="+getHeight()+":index.length="+index.length);switch (action){case MotionEvent.ACTION_DOWN:isShowBg = true;if (oldChoose != c && listener != null){if (c > 0 && c < index.length){listener.onTouchingLetterChanged(index[c]);choose = c;invalidate();}}break;case MotionEvent.ACTION_MOVE:if (oldChoose != c && listener != null){if (c > 0 && c < index.length){listener.onTouchingLetterChanged(index[c]);choose = c;invalidate();}}break;case MotionEvent.ACTION_UP:isShowBg = false;choose = -1;invalidate();break;}return true;}public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener){this.mOnTouchingLetterChangedListener = onTouchingLetterChangedListener;}public interface OnTouchingLetterChangedListener{public void onTouchingLetterChanged(String s);}}

Acitvity:读取手机通讯录,匹配


public class MainActivity extends Activity {private BaseAdapter adapter;      private ListView personList;    private TextView overlay;    private SideBarView letterListView;    private AsyncQueryHandler asyncQuery;      private static final String NAME = "name", NUMBER = "number", SORT_KEY = "sort_key";    private HashMap<String, Integer> alphaIndexer;//存放存在的汉语拼音首字母和与之对应的列表位置    private String[] sections;//存放存在的汉语拼音首字母    private Handler handler;    private OverlayThread overlayThread;      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);                  personList = (ListView) findViewById(R.id.list_view);        letterListView = (SideBarView) findViewById(R.id.sidebarView);        letterListView.setOnTouchingLetterChangedListener(new LetterListViewListener());                asyncQuery = new MyAsyncQueryHandler(getContentResolver());        alphaIndexer = new HashMap<String, Integer>();        handler = new Handler();        overlayThread = new OverlayThread();        initOverlay();    }        @Override      protected void onResume() {          super.onResume();          Uri uri = Uri.parse("content://com.android.contacts/data/phones");          String[] projection = { "_id", "display_name", "data1", "sort_key" };          asyncQuery.startQuery(0, null, uri, projection, null, null,                  "sort_key COLLATE LOCALIZED asc");    }        //查询联系人    private class MyAsyncQueryHandler extends AsyncQueryHandler {            public MyAsyncQueryHandler(ContentResolver cr) {              super(cr);            }            @Override          protected void onQueryComplete(int token, Object cookie, Cursor cursor) {              if (cursor != null && cursor.getCount() > 0) {                  List<ContentValues> list = new ArrayList<ContentValues>();                  cursor.moveToFirst();                  for (int i = 0; i < cursor.getCount(); i++) {                    ContentValues cv = new ContentValues();                      cursor.moveToPosition(i);                      String name = cursor.getString(1);                      String number = cursor.getString(2);                      String sortKey = cursor.getString(3);                    if (number.startsWith("+86")) {                          cv.put(NAME, name);                          cv.put(NUMBER, number.substring(3));  //去掉+86                        cv.put(SORT_KEY, sortKey);                      } else {                          cv.put(NAME, name);                          cv.put(NUMBER, number);                          cv.put(SORT_KEY, sortKey);                      }                      list.add(cv);                  }                  if (list.size() > 0) {                      setAdapter(list);                  }              }          }        }        private void setAdapter(List<ContentValues> list) {    adapter = new ListAdapter(this, list);        personList.setAdapter(adapter);        }        private class ListAdapter extends BaseAdapter {     private LayoutInflater inflater;           private List<ContentValues> list;        public ListAdapter(Context context, List<ContentValues> list) {    this.inflater = LayoutInflater.from(context);    this.list = list;    alphaIndexer = new HashMap<String, Integer>();    sections = new String[list.size()];        for (int i = 0; i < list.size(); i++) {    //当前汉语拼音首字母    String currentStr = getAlpha(list.get(i).getAsString(SORT_KEY));    //上一个汉语拼音首字母,如果不存在为“ ”                String previewStr = (i - 1) >= 0 ? getAlpha(list.get(i - 1).getAsString(SORT_KEY)) : " ";                if (!previewStr.equals(currentStr)) {                String name = getAlpha(list.get(i).getAsString(SORT_KEY));                alphaIndexer.put(name, i);                  sections[i] = name;                 }            }    }    @Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {                  convertView = inflater.inflate(R.layout.list_item, null);                holder = new ViewHolder();                  holder.alpha = (TextView) convertView.findViewById(R.id.alpha);                  holder.name = (TextView) convertView.findViewById(R.id.name);                  holder.number = (TextView) convertView.findViewById(R.id.number);                  convertView.setTag(holder);              } else {                  holder = (ViewHolder) convertView.getTag();              }              ContentValues cv = list.get(position);              holder.name.setText(cv.getAsString(NAME));            holder.number.setText(cv.getAsString(NUMBER));            String currentStr = getAlpha(list.get(position).getAsString(SORT_KEY));            String previewStr = (position - 1) >= 0 ? getAlpha(list.get(position - 1).getAsString(SORT_KEY)) : " ";            if (!previewStr.equals(currentStr)) {                  holder.alpha.setVisibility(View.VISIBLE);                holder.alpha.setText(currentStr);            } else {                  holder.alpha.setVisibility(View.GONE);            }              return convertView;  }private class ViewHolder {TextView alpha;              TextView name;              TextView number;}        }        //初始化汉语拼音首字母弹出提示框    private void initOverlay()     {    LayoutInflater inflater = LayoutInflater.from(this);    overlay = (TextView) inflater.inflate(R.layout.overlay, null);    overlay.setVisibility(View.INVISIBLE);WindowManager.LayoutParams lp = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,PixelFormat.TRANSLUCENT);WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);windowManager.addView(overlay, lp);    }        private class LetterListViewListener implements OnTouchingLetterChangedListener{@Overridepublic void onTouchingLetterChanged(final String s) {if(alphaIndexer.get(s) != null) {int position = alphaIndexer.get(s);personList.setSelection(position);overlay.setText(sections[position]);overlay.setVisibility(View.VISIBLE);handler.removeCallbacks(overlayThread);//延迟一秒后执行,让overlay为不可见handler.postDelayed(overlayThread, 500);} }        }        //设置overlay不可见    private class OverlayThread implements Runnable {@Overridepublic void run() {overlay.setVisibility(View.GONE);}        }        //获得汉语拼音首字母    private String getAlpha(String str) {          if (str == null) {              return "#";          }            if (str.trim().length() == 0) {              return "#";          }            char c = str.trim().substring(0, 1).charAt(0);          // 正则表达式,判断首字母是否是英文字母          Pattern pattern = Pattern.compile("^[A-Za-z]+$");          if (pattern.matcher(c + "").matches()) {              return (c + "").toUpperCase();          } else {              return "#";          }      }    }  


弹出字母:


<?xml version="1.0" encoding="utf-8"?><TextView  xmlns:android="http://schemas.android.com/apk/res/android"  android:textSize="70sp"    android:textColor="#3399ff"    android:background="#ffffff"      android:minWidth="80dip"      android:maxWidth="80dip"      android:padding="5dip"    android:gravity="center" />


关于解析汉子的首字母拼音的问题,这里是查的系统数据库,里面正好有sort_key这一列,比如名字是张三,那么他对应的sort_key就是:ZHANG张SAN三
如果你的数据不是从联系人表中查的,那可以使用第三方jar包,就是pinyin4j-2.5.0


原创粉丝点击