android通讯录列表,A~Z字母提示view
2011-09-23 13:10
351 查看
开发工具:eclipse 运行环境:htc G9 android2.3.3
话不多说,先看效果图
其实左右边的A~Z是一个自定义的View,它直接覆盖在ListView上。
MyLetterListView:
然后我在Activity中OnTouchingLetterChangedListener中监听手指触摸到了哪个字母,然后让列表跳转到对应的位置,
弹出首字母提示框:
延迟一秒让弹出的首字母提示框变为不可见,也就是那个首字母提示框只会显示一秒钟的时间:
还有关于解析汉子的首字母拼音的问题,我这里是查的系统数据库,里面正好有sort_key这一列,比如名字是张三,那么他对应的sort_key就是:ZHANG张SAN三,这样一来就容易多了:
activity代码和布局文件比较长,我就不在这里贴了。
我上传了工程,有兴趣的朋友可以下载下来看下。写的还不够完善,希望大家见谅。
源码(0资源分):http://download.csdn.net/detail/luck_apple/3629137
话不多说,先看效果图
其实左右边的A~Z是一个自定义的View,它直接覆盖在ListView上。
MyLetterListView:
public class MyLetterListView extends View { OnTouchingLetterChangedListener onTouchingLetterChangedListener; String[] b = {"#","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"}; int choose = -1; Paint paint = new Paint(); boolean showBkg = false; public MyLetterListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyLetterListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyLetterListView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(showBkg){ canvas.drawColor(Color.parseColor("#40000000")); } int height = getHeight(); int width = getWidth(); int singleHeight = height / b.length; for(int i=0;i<b.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(b[i])/2; float yPos = singleHeight * i + singleHeight; canvas.drawText(b[i], xPos, yPos, paint); paint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY(); final int oldChoose = choose; final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; final int c = (int) (y/getHeight()*b.length); switch (action) { case MotionEvent.ACTION_DOWN: showBkg = true; if(oldChoose != c && listener != null){ if(c > 0 && c< b.length){ listener.onTouchingLetterChanged(b[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_MOVE: if(oldChoose != c && listener != null){ if(c > 0 && c< b.length){ listener.onTouchingLetterChanged(b[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_UP: showBkg = false; choose = -1; invalidate(); break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public void setOnTouchingLetterChangedListener( OnTouchingLetterChangedListener onTouchingLetterChangedListener) { this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; } public interface OnTouchingLetterChangedListener{ public void onTouchingLetterChanged(String s); } }
然后我在Activity中OnTouchingLetterChangedListener中监听手指触摸到了哪个字母,然后让列表跳转到对应的位置,
弹出首字母提示框:
private class LetterListViewListener implements OnTouchingLetterChangedListener{ @Override public 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, 1500); } } }
延迟一秒让弹出的首字母提示框变为不可见,也就是那个首字母提示框只会显示一秒钟的时间:
//设置overlay不可见 private class OverlayThread implements Runnable { @Override public void run() { overlay.setVisibility(View.GONE); } }
还有关于解析汉子的首字母拼音的问题,我这里是查的系统数据库,里面正好有sort_key这一列,比如名字是张三,那么他对应的sort_key就是:ZHANG张SAN三,这样一来就容易多了:
//获得汉语拼音首字母 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]+{1}quot;); if (pattern.matcher(c + "").matches()) { return (c + "").toUpperCase(); } else { return "#"; } }如果你的数据不是从联系人表中查的,那可以使用第三方jar包,就是pinyin4j-2.5.0。
activity代码和布局文件比较长,我就不在这里贴了。
我上传了工程,有兴趣的朋友可以下载下来看下。写的还不够完善,希望大家见谅。
源码(0资源分):http://download.csdn.net/detail/luck_apple/3629137
相关文章推荐
- android通讯录列表,A~Z字母提示view
- Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
- 【转】android通讯录列表,A~Z字母提示view
- Android自定义控件5----继承View通讯录索引功能之1初始化显示字母列表
- Android自定义控件5----继承View通讯录索引功能之3在按下或和移动时显示更新提示字母
- android快速滑动列表+首字母提示(仿通讯录)
- android通讯录列表,A~Z字母提示(修正版)
- 【Android】自定义View快速建立字母索引列表
- [置顶] Android通讯录字母排序城市列表展示效果
- Android自定义控件5----继承View通讯录索引功能之2在按下和移动的时候操作字母变色
- Android仿微信实现通讯录字母列表索引
- Android自定义View——实现联系人列表字母索引
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android 利用AutoCompleteTextView实现模糊搜索功能,搜索结果自动提示,识别拼音首字母并转汉字提示
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- 我的Android进阶之旅------>Android之AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字)
- Android自定义View实现通讯录字母索引(仿微信通讯录)
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)