Android ListView A~Z快速索引(改进版)
上一篇文章虽然实现了ListView 快速索引的效果,但是有一个小小的Bug。这个Bug我在前面也说了,这篇文章就来解决这个Bug。
我研究的时候发现只要showBg值为true,中间的字母就显示,而当showBg 的值为false的时候中间的字母就可以消失。只要SlideBar的状态为ACTION_DOWN和ACTION_MOVE 的时候showBg的值为true,而ACTION_UP的时候showBg的值就为false;
所以根据上面这个特征,我们只要把OnToucheLetterChange()这个回调函数的参数改一下就可以了。改成onTouchLetterChange(boolean isTouched, String s)
boolean类型的参数直接把showBg传过去就可以了。
改进后的代码如下:
- package com.folyd.tuan.view;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Typeface;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import android.view.View;
- /**
- * 自定义的View,实现ListView A~Z快速索引效果
- *
- * @author Folyd
- *
- */
- public class SlideBar extends View {
- private Paint paint = new Paint();
- private OnTouchLetterChangeListenner listenner;
- // 是否画出背景
- private boolean showBg = false;
- // 选中的项
- private int choose = -1;
- // 准备好的A~Z的字母数组
- public static String[] letters = { "#", "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" };
- // 构造方法
- public SlideBar(Context context) {
- super(context);
- }
- public SlideBar(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- // 获取宽和高
- int width = getWidth();
- int height = getHeight();
- // 每个字母的高度
- int singleHeight = height / letters.length;
- if (showBg) {
- // 画出背景
- canvas.drawColor(Color.parseColor("#55000000"));
- }
- // 画字母
- for (int i = 0; i < letters.length; i++) {
- paint.setColor(Color.BLACK);
- // 设置字体格式
- paint.setTypeface(Typeface.DEFAULT_BOLD);
- paint.setAntiAlias(true);
- paint.setTextSize(20f);
- // 如果这一项被选中,则换一种颜色画
- if (i == choose) {
- paint.setColor(Color.parseColor("#F88701"));
- paint.setFakeBoldText(true);
- }
- // 要画的字母的x,y坐标
- float posX = width / 2 - paint.measureText(letters[i]) / 2;
- float posY = i * singleHeight + singleHeight;
- // 画出字母
- canvas.drawText(letters[i], posX, posY, paint);
- // 重新设置画笔
- paint.reset();
- }
- }
- /**
- * 处理SlideBar的状态
- */
- @Override
- public boolean dispatchTouchEvent(MotionEvent event) {
- final float y = event.getY();
- // 算出点击的字母的索引
- final int index = (int) (y / getHeight() * letters.length);
- // 保存上次点击的字母的索引到oldChoose
- final int oldChoose = choose;
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- showBg = true;
- if (oldChoose != index && listenner != null && index > 0
- && index < letters.length) {
- choose = index;
- listenner.onTouchLetterChange(showBg, letters[index]);
- invalidate();
- }
- break;
- case MotionEvent.ACTION_MOVE:
- if (oldChoose != index && listenner != null && index > 0
- && index < letters.length) {
- choose = index;
- listenner.onTouchLetterChange(showBg, letters[index]);
- invalidate();
- }
- break;
- case MotionEvent.ACTION_UP:
- showBg = false;
- choose = -1;
- if (listenner != null) {
- if (index <= 0) {
- listenner.onTouchLetterChange(showBg, "A");
- } else if (index > 0 && index < letters.length) {
- listenner.onTouchLetterChange(showBg, letters[index]);
- } else if (index >= letters.length) {
- listenner.onTouchLetterChange(showBg, "Z");
- }
- }
- invalidate();
- break;
- }
- return true;
- }
- /**
- * 回调方法,注册监听器
- *
- * @param listenner
- */
- public void setOnTouchLetterChangeListenner(
- OnTouchLetterChangeListenner listenner) {
- this.listenner = listenner;
- }
- /**
- * SlideBar 的监听器接口
- *
- * @author Folyd
- *
- */
- public interface OnTouchLetterChangeListenner {
- void onTouchLetterChange(boolean isTouched, String s);
- }
- }
Activity中就很容易处理了:
- mSlideBar
- .setOnTouchLetterChangeListenner(new OnTouchLetterChangeListenner() {
- @Override
- public void onTouchLetterChange(boolean isTouched, String s) {
- float_letter.setText(s);
- if (isTouched) {
- float_letter.setVisibility(View.VISIBLE);
- } else {
- float_letter.postDelayed(new Runnable() {
- @Override
- public void run() {
- float_letter.setVisibility(View.GONE);
- }
- }, 100);
- }
- int position = array.indexOf(s);
- mListView.setSelection(position);
- }
- });
这样就解决Bug了。哈哈。
Android ListView A~Z快速索引(改进版)的更多相关文章
- 实现ListView A~Z快速索引
ListView A~Z快速索引这种效果在通信录和城市列表中经常看到,方便用户查找,是一种增加用户体验的好方法. 实现步骤: 1.自定义一个名叫SlideBar 的View. 2.在布局文件中加入这个 ...
- 8.快速索引、listview
实现这样的效果 布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- Android 快速索引(城市列表和联系人)
最近需要实现一个城市列表的快速索引功能.类似于联系人应用,根据姓名首字母快速索引功能. 要实现这个功能只需要解决两个问题:1.对列表进行分组(具有同一特征),并且能够快速定位到该组的第一项 2.右侧分 ...
- Android-自定义联系人快速索引
效果图: 布局去指定 view.custom.shangguigucustomview.MyCustomIndexView 自定义View对象 <!-- 自定义联系人快速索引 --> &l ...
- [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能
感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d3e3ab10c62013697408 作者:黄宁源 一,背景 Recy ...
- 【转】android ListView 几个重要属性
android ListView 几个重要属性 分类: Android2012-03-08 19:25 19324人阅读 评论(5) 收藏 举报 listviewandroid活动javalistnu ...
- 实现Android ListView 自动加载更多内容
研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...
随机推荐
- 添加鼠标右键菜单项(EditPlus为例)
下载Editplus,发现大多是绿色版,这就导致鼠标右键快捷菜单了,使用起来不方面,上网搜集了下资料,解决方法很简单: 首先进入注册表:regedit 然后如图设置新项. 其中editplus是右键菜 ...
- CSS之清除浮动
一.清除浮动的目的. 1.当一个父元素的高度不写或为auto时,而且这个父元素内又有浮动的子元素,那么这时候该父元素的高度将不会自动适应子元素的高度,也可以说高度是0px; 有如下代码: <di ...
- HTML5学习摘录
设计原理 不是规范里都包含什么,而是规范里为什么会包含它们,以及在设计这个规范的时候,设计者们是怎么看待这些东西的. 发展史:HTML2.0——>HTML3.2——>HTML4.0.1—— ...
- poj 1001 求高精度幂
本题的测试用例十分刁钻,必须要考虑到很多的细节问题,在这里给出一组测试用例及运行结果: 95.123 12 548815620517731830194541.899025343415715973535 ...
- Struts2实现单文件上传
首先配置一下web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi ...
- 2014年百度之星资格赛第三题Xor Sum
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeu ...
- AC自动机跟随Kuangbing学习笔记
http://www.cnblogs.com/kuangbin/p/3164106.html kuangbin的博客 第一段代码基本是COPY kuangbin的.. 1.HDU 2222 Keywo ...
- yum 安装软件提示错误
试用yum命令装软件时,遇到了下面的问题,错误提示: rpmdb: unable to join the environment error: db4 error(11) from dbenv-> ...
- C# ?? 操作符示例
static int? GetNullableInt() { return null; } static string GetStringValue() { return null; } static ...
- MySQL Update 使用
备忘: USE `xxx`; ; UPDATE `TB_MB_1` T SET T.`MedicalCount` = ( SELECT S.Total-- ,S.`HospitalID` FROM( ...