当前位置: 首页 > 编程日记 > 正文

玩转android自定义控件二——自定义索引栏listview

带索引栏的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

相关文章:

172. 阶乘后的零

给定一个整数 n&#xff0c;返回 n! 结果尾数中零的数量。 示例 1: 输入: 3 输出: 0 解释: 3! 6, 尾数中没有零。示例 2: 输入: 5 输出: 1 解释: 5! 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) 。 话不多说&#xff0c;先上代码&#xff1a; class So…

Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

Mysql函数group_concat、find_in_set进行数据库字段值翻译 场景 配方表&#xff1a;记录包含的原料 sources表示原料&#xff0c;字段值之间用逗号分隔 原料表&#xff1a;对应原料id和原料名称 现需要查询出的原料结果显示为原料名称&#xff0c;并以逗号分隔。可通过函数g…

网站速度优化-前端篇

2019独角兽企业重金招聘Python工程师标准>>> 页面中最好不要有js片段&#xff0c;合并多个js为一个js&#xff0c;并将js压缩 &#xff08;百度搜索&#xff0c;有在线js压缩、解压缩工具&#xff09;&#xff0c;并放在文档底部页面中最好不要有css片段&#xff0c…

HashMap总结

为什么用HashMap HashMap是一个Hash桶(数组链表)&#xff0c;桶存储的内容是键值对(Key-value)映射HashMap采用了数组和链表的数据结构&#xff0c;能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized&#xff0c;所以HashMap很快(哈哈哈)与HashT…

Blender与Substance painter制作三维手枪

你会学到: Blender和Substance painter的基础知识 建模 纹理制作 烘焙 Uv展开 Boolens和斜角修改器 如何制作游戏准备枪 课程获取&#xff1a;Blender与Substance painter制作三维手枪 – 云桥网络-CG技术学习平台 要求 Blender Substance painter 你好&#xff0c;我是3d艺术…

Java学习总结:32(Runtime类)

Runtime类 该类用于表示虚拟机(JVM)运行时的状态&#xff0c;每次启动JVM都对应一个Runtime实例&#xff0c;且只有一个实例&#xff0c;利用Runtime类可以启动新的进程或进行相关运行时环境的操作。此外&#xff0c;该类采用单例模式设计&#xff0c;对象不可以直接实例化。所…

转:查看系统是64位还是32位

1、getconf LONG_BIT or getconf WORD_BIT 例如&#xff1a; 2、file /bin/ls 例如&#xff1a; 查看linux的版本: 转载于:https://www.cnblogs.com/lei-lei/p/5029120.html

Redis问题——Error: 磁盘在使用中,或被另一个进程锁定。

Redis出于对数据保护&#xff0c;默认只能本地客户端连接。远程连接就会出现以上错误。如何解决这一问题&#xff0c;看下&#xff1a; server -A&#xff0c;PC-A&#xff0c; 修改server-A的redis.conf:注释掉本地绑定&#xff1b; bind 127.0.0.1 表示指定绑定本机IP&…

[转]C#索引器

索引器是一种特殊的类成员&#xff0c;它能够让对象以类似数组的方式来存取&#xff0c;使程序看起来更为直观&#xff0c;更容易编写。 1、索引器的定义 C#中的类成员可以是任意类型&#xff0c;包括数组和集合。当一个类包含了数组和集合成员时&#xff0c;索引器将大大简化对…

从Java8到Java21各版本新特性详解

​ 下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线,可以看出,JDK 17的支持时间最长,可以延续到2029年9月。考虑到技术更新的速度,这次免费商用8年的时间可谓是经过精心考虑,旨在让用户放心地升级到JDK 17(不过JDK 8的支持时间更长,到2030年12月)。​ 从JDK诞生到现在,仅有几个版本得到了长期支持,主要包括JDK 7、JDK 8、JDK 11以及即将发布的JDK 17,它将是继Java 8之后最重要的LTS版本,是Java社区八年努力的成果。

make[1]: g++: Command not found

今天装了nmap软件&#xff0c;开始报这种错&#xff1a;g -c -Iliblua -Ilibdnet-stripped/include -Ilibpcre -Ilibpcap -Inbase -Insock/include -fno-strict-aliasing -DHAVE_CONFIG_H -DNMAP_NAME\"Nmap\" -DNMAP_URL\"http://nmap.org\" -DNMAP_PL…

学习如何用平板电脑设计和绘制自己的动漫角色

创造你自己的动漫人物插图 学习如何用平板电脑设计和绘制自己的动漫角色 大家好&#xff0c;我是Pesa&#xff0c;一个想把快乐和希望融入到讲述故事的插画中的插画师。一点一点地&#xff0c;我画出我喜欢和希望的事物的场景&#xff0c;它把我带到了101班。 艺术世界 艺术是…

Java学习总结:33(System类)

System类 System类的方法 No.方法类型描述1public static void arraycopy(Object src&#xff0c;int srcPos&#xff0c;Object dest&#xff0c;int destPos&#xff0c;int length)普通数组粘贴操作2public static long currentTimeMillis()普通取得当前的日期时间&#x…

重磅推出:AutoProject Studio 自动化项目生成器

AutoProject Studio 自动化项目生成器 核心架构图 AutoProject Studio 自动化项目生成器是一款基于C#.Net Framework 4.0为平台自主研发、专为软件设计、开发、管理的自动化项目(代码)生成器&#xff0c;同时也是一个智能化软件开发平台与超高效率、超低成本的最优解决方案。 该…

2022-2028年中国基因工程药物产业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国基因工程药物行业市场行业相关概述、中国基因工程药物行业市场行业运行环境、分析了中国基…

Perl 模块安装遇到的问题解决办法

2019独角兽企业重金招聘Python工程师标准>>> 问题1&#xff1a;Warning (usually harmless): YAML not installed, will not store persistent state 解决办法&#xff1a; 官网下载&#xff1a;http://search.cpan.org/~mstrout/YAML-0.84/lib/YAML.pm 上传安装…

如何终止一个正在动态执行的命令

比如&#xff0c;我们在终端输入了top 那么它就会一直动态的运行下去。 我们怎样让它终止呢&#xff1f; 很简单&#xff0c;Ctrl C就可以了。 另外&#xff0c;还有一种方法&#xff0c; 直接按一下q也可以退出。 它们两个的效果是一样的。转载于:https://www.cnblogs.com/o8l…

绘制你的世界:探索构图和真实的深度感

MP4 |视频:h264&#xff0c;1920 x 1080 |音频:AAC&#xff0c;48 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;| 2h 24m |大小解压后:3.2 GB 勾画你的世界不是关于天赋&#xff0c;而是关于任何人都可以学习的原则和…

Java学习总结:34(对象克隆)

对象克隆 对象克隆就是对对象的复制操作&#xff0c;在Object类中存在一个clone()方法用于对象的克隆操作。该方法如下&#xff1a; protected Object clone() throws CloneNotSupportedException&#xff1b;我们注意到&#xff1a; 1.此方法使用了protected访问权限&#x…

win7下的IP-主机名映射

今天学了个技巧&#xff0c;win7下有个目录&#xff1a;C:\Windows\System32\drivers\etc该目录下有个文件&#xff1a;hosts在这个文件里面我们可以映射IP-主机名&#xff1a;127.0.0.1 localhost........格式为&#xff1a;IP空格主机名这样我们就可以用主机名代替IP了。转载…

Spring AOP + Redis解决重复提交的问题

Spring AOP Redis解决重复提交的问题 用户在点击操作的时候&#xff0c;可能会连续点击多次&#xff0c;虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击&#xff0c;但是如果别人拿到请求进行模拟&#xff0c;依然会出现问题&#xff0c;项目是用JWT进行认证…

转:Flash 插件面板 DragonBonesDesignPanel 的绿色安装方法

最近在cocos2d-js下捣腾Dragonbones。转一个文章&#xff0c;大家可以参考安装Dragonbones。关于这个Dragonbones&#xff0c;5月份的时候还用得好好的&#xff0c;cocos2d-js还能妥妥的加载。最近就不行了&#xff0c;原来默默的升级了。还是得找回原来的2.0版本&#xff0c;后…

任务18:控制反转

控制反转 实现你的依赖&#xff0c;采用什么依赖&#xff0c;不由你自己决定&#xff0c;这个控制交给IOC容器。 这里所有的实现都不由你自己决定&#xff0c;我们只需要传给你就可以了。谁来传呢&#xff1f;容器来传给他 内存的Repository&#xff0c;这里实现的比较简单。 这…

Quixel megascans模型材质贴图合集包

Quixel megascans是一个在线高分辨率扫描模型和贴图库&#xff0c;一致的PBR校准的表面&#xff0c;植被&#xff0c;和三维扫描模型&#xff0c;还包括用于管理的桌面应用、混合和输出你的扫描数据的程序。它的产品已经与游戏和电影工作室合作。 quixel megascans可以帮助您创…

Java学习总结:35(数字操作类)

Java的数字操作类 一.Math类 Math类是一个专门用来进行数学计算的操作类&#xff0c;它提供了一系列的数学计算方法。在Math类里面提供的一切方法都是static型方法&#xff0c;所以可以直接由类名称进行调用。 例&#xff1a;观察四舍五入操作 package Project.Study.MathC…

STL笔记(5)条款49:学习破解有关STL的编译器诊断信息

STL笔记&#xff08;5&#xff09;条款49&#xff1a;学习破解有关STL的编译器诊断信息 条款49&#xff1a;学习破解有关STL的编译器诊断信息 用一个特定的大小定义一个vector是完全合法的&#xff0c; vector<int> v(10); // 建立一个大小为10的vector而string在很多…

执子之手,与子偕老。你同意么?

(1):5岁的时候&#xff0c;我说我爱你。你歪着脑袋&#xff0c;眨着水晶般的大眼睛&#xff0c;疑惑地问我&#xff1a;“什么意思呀&#xff1f;” (2):15岁的时候&#xff0c;我说:"我爱你".你的脸红得像火烧云&#xff0c;头深深地低着&#xff0c;摆弄著衣襟&…

34种墨西哥植物模型 Globe Plants – Bundle 34 Mexican Plants

Globe Plants Bundle 34墨西哥植物(3D模型)包括15种3D树木、灌木和肉质植物&#xff0c;用于南美洲的风景、住宅、花园和一般景观美化目的&#xff0c;特别是墨西哥&#xff0c;具有85种独特的照片逼真质量的3D植物模型&#xff0c;具有多种形式&#xff0c;可用于您的许多场景…

Java学习总结:36(日期处理类)

日期处理类 Date类 Date类常用方法 No.方法类型描述1public Date()构造实例化Date类对象2public Date(long date)构造将数字变为Date类对象&#xff0c;long为日期时间数据3public long getTime()普通将当前的日期时间变为long型 例&#xff1a;取得当前的日期时间 package…

最强的篮球队和马尔可夫模型

打篮球经常遇到这种情况&#xff0c;11个人&#xff0c;分4、4、3共三套&#xff0c;一群人少时间玩&#xff0c;在一个失败的团队的人下阵来填补空缺。因此&#xff0c;我认为&#xff0c;&#xff0c;会不会出现一个最强组合&#xff0c;使得这4个人一直赢比赛呢&#xff1f;…