android通讯录列表,A~Z字母提示view

开发工具:eclipse       运行环境:htc G9 android2.3.3

话不多说,先看效果图




其实左右边的A~Z是一个自定义的View,它直接覆盖在ListView上。

MyLetterListView:

  1. public class MyLetterListView extends View {  
  2.       
  3.     OnTouchingLetterChangedListener onTouchingLetterChangedListener;  
  4.     String[] b = {"#","A","B","C","D","E","F","G","H","I","J","K","L"  
  5.             ,"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};  
  6.     int choose = -1;  
  7.     Paint paint = new Paint();  
  8.     boolean showBkg = false;  
  9.   
  10.     public MyLetterListView(Context context, AttributeSet attrs, int defStyle) {  
  11.         super(context, attrs, defStyle);  
  12.     }  
  13.   
  14.     public MyLetterListView(Context context, AttributeSet attrs) {  
  15.         super(context, attrs);  
  16.     }  
  17.   
  18.     public MyLetterListView(Context context) {  
  19.         super(context);  
  20.     }  
  21.       
  22.     @Override  
  23.     protected void onDraw(Canvas canvas) {  
  24.         super.onDraw(canvas);  
  25.         if(showBkg){  
  26.             canvas.drawColor(Color.parseColor("#40000000"));  
  27.         }  
  28.           
  29.         int height = getHeight();  
  30.         int width = getWidth();  
  31.         int singleHeight = height / b.length;  
  32.         for(int i=0;i<b.length;i++){  
  33.            paint.setColor(Color.WHITE);  
  34.            paint.setTypeface(Typeface.DEFAULT_BOLD);  
  35.            paint.setAntiAlias(true);  
  36.            if(i == choose){  
  37.                paint.setColor(Color.parseColor("#3399ff"));  
  38.                paint.setFakeBoldText(true);  
  39.            }  
  40.            float xPos = width/2  - paint.measureText(b[i])/2;  
  41.            float yPos = singleHeight * i + singleHeight;  
  42.            canvas.drawText(b[i], xPos, yPos, paint);  
  43.            paint.reset();  
  44.         }  
  45.          
  46.     }  
  47.       
  48.     @Override  
  49.     public boolean dispatchTouchEvent(MotionEvent event) {  
  50.         final int action = event.getAction();  
  51.         final float y = event.getY();  
  52.         final int oldChoose = choose;  
  53.         final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;  
  54.         final int c = (int) (y/getHeight()*b.length);  
  55.           
  56.         switch (action) {  
  57.             case MotionEvent.ACTION_DOWN:  
  58.                 showBkg = true;  
  59.                 if(oldChoose != c && listener != null){  
  60.                     if(c > 0 && c< b.length){  
  61.                         listener.onTouchingLetterChanged(b[c]);  
  62.                         choose = c;  
  63.                         invalidate();  
  64.                     }  
  65.                 }  
  66.                   
  67.                 break;  
  68.             case MotionEvent.ACTION_MOVE:  
  69.                 if(oldChoose != c && listener != null){  
  70.                     if(c > 0 && c< b.length){  
  71.                         listener.onTouchingLetterChanged(b[c]);  
  72.                         choose = c;  
  73.                         invalidate();  
  74.                     }  
  75.                 }  
  76.                 break;  
  77.             case MotionEvent.ACTION_UP:  
  78.                 showBkg = false;  
  79.                 choose = -1;  
  80.                 invalidate();  
  81.                 break;  
  82.         }  
  83.         return true;  
  84.     }  
  85.   
  86.     @Override  
  87.     public boolean onTouchEvent(MotionEvent event) {  
  88.         return super.onTouchEvent(event);  
  89.     }  
  90.   
  91.     public void setOnTouchingLetterChangedListener(  
  92.             OnTouchingLetterChangedListener onTouchingLetterChangedListener) {  
  93.         this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;  
  94.     }  
  95.   
  96.     public interface OnTouchingLetterChangedListener{  
  97.         public void onTouchingLetterChanged(String s);  
  98.     }  
  99.       
  100. }  

然后我在Activity中OnTouchingLetterChangedListener中监听手指触摸到了哪个字母,然后让列表跳转到对应的位置,

弹出首字母提示框:

  1. private class LetterListViewListener implements OnTouchingLetterChangedListener{  
  2.   
  3.         @Override  
  4.         public void onTouchingLetterChanged(final String s) {  
  5.             if(alphaIndexer.get(s) != null) {  
  6.                 int position = alphaIndexer.get(s);  
  7.                 personList.setSelection(position);  
  8.                 overlay.setText(sections[position]);  
  9.                 overlay.setVisibility(View.VISIBLE);  
  10.                 handler.removeCallbacks(overlayThread);  
  11.                 //延迟一点五秒后执行,让overlay为不可见  
  12.                 handler.postDelayed(overlayThread, 1500);  
  13.             }   
  14.         }  
  15.           
  16.     }  

延迟一秒让弹出的首字母提示框变为不可见,也就是那个首字母提示框只会显示一秒钟的时间:

  1. //设置overlay不可见  
  2.     private class OverlayThread implements Runnable {  
  3.   
  4.         @Override  
  5.         public void run() {  
  6.             overlay.setVisibility(View.GONE);  
  7.         }  
  8.           
  9.     }  

还有关于解析汉子的首字母拼音的问题,我这里是查的系统数据库,里面正好有sort_key这一列,比如名字是张三,那么他对应的sort_key就是:ZHANG张SAN三,这样一来就容易多了:

  1. //获得汉语拼音首字母  
  2.     private String getAlpha(String str) {    
  3.         if (str == null) {    
  4.             return "#";    
  5.         }    
  6.     
  7.         if (str.trim().length() == 0) {    
  8.             return "#";    
  9.         }    
  10.     
  11.         char c = str.trim().substring(01).charAt(0);    
  12.         // 正则表达式,判断首字母是否是英文字母    
  13.         Pattern pattern = Pattern.compile("^[A-Za-z]+{1}quot;);    
  14.         if (pattern.matcher(c + "").matches()) {    
  15.             return (c + "").toUpperCase();    
  16.         } else {    
  17.             return "#";    
  18.         }    
  19.     }    
如果你的数据不是从联系人表中查的,那可以使用第三方jar包,就是pinyin4j-2.5.0。
activity代码和布局文件比较长,我就不在这里贴了。

我上传了工程,有兴趣的朋友可以下载下来看下。写的还不够完善,希望大家见谅。

源码(0资源分):http://download.csdn.net/detail/luck_apple/3629137
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值