Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
2017-07-20 12:17
1101 查看
本文实例讲述了Android开发之自定义view实现通讯录列表A~Z字母提示效果。分享给大家供大家参考,具体如下:
开发工具:eclipse
运行环境:htc G9 android2.3.3
话不多说,先看效果图
其实左右边的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代码和布局文件比较长,我就不在这里贴了。
附:demo源码点击此处本站下载。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作json格式数据技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
您可能感兴趣的文章:
- Android保存联系人到通讯录的方法
- Android编程实现通讯录中联系人的读取,查询,添加功能示例
- Android自定义View实现通讯录字母索引(仿微信通讯录)
- Android实现通讯录效果――获取手机号码和姓名
- Android获取手机通讯录、sim卡联系人及调用拨号界面方法
- Android通讯录开发之删除功能的实现方法
- 使用adb命令向Android模拟器中导入通讯录联系人的方法
- Android实现仿通讯录侧边栏滑动SiderBar效果代码
- Android手机联系人快速索引(手机通讯录)
- Android跳转到通讯录获取用户名称和手机号码的实现思路
- Android编程操作手机通讯录的方法示例
相关文章推荐
- Android编程基于自定义view实现公章效果示例【附源码下载】
- Android开发进阶自定义控件之滑动开关实现方法【附demo源码下载】
- android通讯录列表,A~Z字母提示view
- Android仿zaker用手向上推动的特效开发【推动门效果】(附demo源码下载)
- Android编程滑动效果之Gallery+GridView实现图片预览功能(附demo源码下载)
- js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
- android通讯录列表,A~Z字母提示view
- Android实现软件列表的点击启动另外一个程序功能【附demo源码下载】
- 最近较流行的效果 Android自定义View实现倾斜列表/图片
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- 【转】android通讯录列表,A~Z字母提示view
- android开发游记:viewpager关联tabs,自定义tabs实现翻页滚动效果
- jQuery实现的超链接提示效果示例【附demo源码下载】
- Android开发 自定义ViewGroup 实现微信九格图功能(图片不同排布不同) 和 一种图片点击变暗效果
- Android实战简易教程<三十三>(自定义View实现控件晃动提示效果)
- Android开发-使用自定义View实现loading效果
- Android编程实现可滑动的开关效果(附demo源码下载)
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- Android TreeView效果实现方法(附demo源码下载)