带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样:

  今天,我们就从零到一实现这个具有索引栏的listview.

  怎么实现这个控件了,我们应当梳理出一个思路。

  ①首先应当将字母的索引栏继承与一个控件,通过ondraw方法将字母画出来。

  ②然后我们应该监听这个字母控件的ontouch事件,来判断用户到底是按了那个字母。

  ③就是实现这个索引栏与listview的联动,就是将listview滑动到按下字母的位置。

  大体流程图如下:

  有了前面铺垫,我们引出本文重头戏——代码。

  首先,索引栏这个控件如何将字母绘制在控件上的代码:

    /*** 侧边栏显示字母*/private String[] words = { "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", "#" };/*** 绘制列表控件的方法* 将要绘制的字母以从上到下的顺序绘制在一个指定区域* 如果是进行选中的字母就进行高亮显示*/@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);int height = getHeight();// 获取对应高度int width = getWidth(); // 获取对应宽度int singleHeight = height / words.length;// 获取每一个字母的高度for (int i = 0; i < words.length; i++) {paint.setColor(Color.rgb(33, 65, 98));// paint.setColor(Color.WHITE);paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setAntiAlias(true);paint.setTextSize(20f);// 选中的状态if (isdown) {paint.setColor(Color.parseColor("#ffffff"));//paint.setFakeBoldText(true);}// x坐标等于中间-字符串宽度的一半.float xPos = width / 2 - paint.measureText(words[i]) / 2;float yPos = singleHeight * i + singleHeight;canvas.drawText(words[i], xPos, yPos, paint);paint.reset();// 重置画笔}}

  通过上述的代码,我们可以得出以下的结论:将要绘制的字母以从上到下的顺序绘制在一个指定区域,每个字母的x坐标是一样的,x坐标即为控件宽度一半。如果当前字母选中的话,就高亮显示。思路如图所示:

  紧接着,就来到第二步,确定用户到底点击是那个字母,代码如下:

/*** 处理触摸事件的方法* 用户按下时候,整个控件背景变化* 根据按下y坐标 判断究竟用户按下那个字母* 当前字母高亮显示 将其字母显示listview中央*/@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {int action = event.getAction();final float y = event.getY();// 点击y坐标final int oldChoose = choose;final ITouchingLetterChangedListener listener = onTouchingLetterChangedListener;final int c = (int) (y / getHeight() * words.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.switch (action) {case MotionEvent.ACTION_UP:isdown=false;setBackgroundResource(android.R.color.transparent);choose = -1;//invalidate();if (textViewDialog != null) {textViewDialog.setVisibility(View.INVISIBLE);}break;default:isdown=true;setBackgroundResource(R.color.sidebar_bg_color);if (oldChoose != c) {if (c >= 0 && c < words.length) {if (listener != null) {listener.OnTouchingLetterChanged(words[c]);}if (textViewDialog != null) {textViewDialog.setText(words[c]);textViewDialog.setVisibility(View.VISIBLE);}choose = c;invalidate();}}break;}return true;}

  通过上述的代码,我们可以这样总结:当用户按下的时候,整个控件背景发生变化,根据用户按下的y坐标来确定用户究竟是按下那个字母,并且将按下字母显示屏幕的中央,效果图如下:

  最终,将listview 移动到按下字母相应位置,代码如下:

/*** 根据用户点击那个字母将listview移动到相应位置*/sidebar.setOnTouchingLetterChangedListener(new ITouchingLetterChangedListener() {@Overridepublic void OnTouchingLetterChanged(String cString) {int position = -1;if (cString.length() > 0) {position = myAdapter.getPositionForSection(cString.charAt(0));}if (position != -1) {listview.setSelection(position);} else if (cString.contains("#")) {listview.setSelection(0);}}});

  连篇累牍说了这么多,控件大功告成的效果为:

  源代码地址为:

  http://pan.baidu.com/s/1dDMDjhR

转载于:https://www.cnblogs.com/android-blogs/p/5026611.html

玩转android自定义控件二——自定义索引栏listview相关推荐

  1. Android自定义控件之自定义时钟

    Android自定义控件之自定义时钟 这个是我从别的开源项目中挖出来的,真心写的很不错,然后继续下来以便不时之需,直接上代码: WatcherBoard.java这个是自定义的时钟类 package ...

  2. Android自定义控件三部曲文章索引

    前言:在我从C++转到Android时,就被Android里炫彩斑斓的自定义控件深深折服,想知道如果想利用C++实现这些功能,那是相当困难的.从那时候起,我就想,等我学会了自定义控件,一定要写一篇系列 ...

  3. android如何让自定义控件居中,Android自定义控件之自定义TextView,实现drawableLeft可以和文字一起居中...

    如何实现使用TextView的DrawableLeft使图片和文字居中显示呢??? 代码如下: 1.首先自定义一个类,继承TextViewpackage com.test.signcalendar.w ...

  4. 原 Android自定义控件三部曲文章索引

    转自 https://blog.csdn.net/harvic880925/article/details/50995268 前言:在我从C++转到Android时,就被Android里炫彩斑斓的自定 ...

  5. Android自定义控件(二)——支付宝支付成功动画

    读律看书三九年,乌纱头上有青天,男儿欲画凌烟阁,第一功名不爱钱. 不知道大家关注过没有,在你使用支付宝的过程中,有一个支付成功的动画,虽然说很小,但看起来其实还是蛮实用的,涉及的知识点有Android ...

  6. 玩转Android之二维码生成与识别

    二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了.那么今天我们就来看看怎么样在我们自己的App中集成二维码的 ...

  7. android textview 楷体,Android自定义控件之自定义Text,画出米字格-FenGKun

    public class WordText extends TextView { /** 画笔 */ private Paint paint = new Paint(); // 定义画笔 public ...

  8. android自定义进度条_Android中的自定义进度栏

    android自定义进度条 Custom progress bar in android application gives it a personal touch. In this tutorial ...

  9. android 打造炫酷导航栏(仿UC头条)

    年后开始上班甚是清闲,所以想捣鼓一些东西.在翻阅大神杰作Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI 的时候看到下面有一条评论说,如果导航栏能滑动就更好了. ...

最新文章

  1. “AI下乡”:华为和袁隆平一起种海水稻,欲改造1亿亩良田
  2. OpenGL中的reshape函数(整理)
  3. 20145104张家明实验五
  4. 2cocos2dx别踩白块游戏案例
  5. Linux 权限管理: 权限的概念、权限管理、文件访问权限的设置、 粘滞位
  6. Windows下UltraEdit查看Objective-C代码高亮工具
  7. 那些年删过的库,跑过的路,你从中找到解决方法了吗?
  8. (21)System Verilog按时间顺序的通知需求(变量驱动)
  9. thinkphp自动验证分析
  10. Android中关于Adapter的使用(下)BaseAdapter
  11. 【主机】计算机缓存机制
  12. python所有软件-太牛逼!一款软件几乎可以操作所有的数据库!
  13. APS自动排产 — 排产结果拉动物料需求计划
  14. 计算机学校教师培训方案,教师基本功培训方案范文
  15. QT QColor颜色选择器学习
  16. Apache Log4j使用实例
  17. 审慎 合宜与慈善三种学派的分类与核心思想
  18. 近期缺货的晶振厂家国内替代VS国外
  19. 《MATLAB智能算法30个案例》:第20章 基于遗传模拟退火算法的聚类算法
  20. 【Designing ML Systems】第 7 章 :模型部署和预测服务

热门文章

  1. xp系统蓝屏代码7b_电脑蓝屏重启不求人!学会这个方法,自己就能轻松解决!...
  2. Linux shell 学习笔记(15)— shell 正则表达式
  3. Docker学习(五)-----Docker查看日志
  4. spring Bean自动装配
  5. 【J2SE】语言基础
  6. NLPML_总结_20210208
  7. 受用一生的高效 PyCharm 使用技巧(二)pycharm 指定参数运行文件
  8. 正则表达式中的\.表示什么意思
  9. 自定义 DataLoader
  10. 2021年大数据Flink(二十三):​​​​​​​Watermaker案例演示