博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android ListView A~Z快速索引(改进版)
阅读量:6507 次
发布时间:2019-06-24

本文共 4098 字,大约阅读时间需要 13 分钟。

虽然实现了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了。哈哈。

 

 

转载地址:http://gawfo.baihongyu.com/

你可能感兴趣的文章
通信常用概念
查看>>
FreeBinary 格式说明
查看>>
使用Spring Cloud和Docker构建微服务
查看>>
常用链接
查看>>
NB-IoT的成功商用不是一蹴而就
查看>>
九州云实战人员为您揭秘成功部署OpenStack几大要点
查看>>
1.电子商务支付方式有哪些 2.比较不同支付方式的优势劣势
查看>>
医疗卫生系统被爆漏洞,7亿公民信息泄露……
查看>>
神秘函件引发的4G+与全网通的较量
查看>>
CloudCC:智能CRM究竟能否成为下一个行业风口?
查看>>
高德开放平台推出LBS游戏行业解决方案提供专业地图平台能力支持
查看>>
追求绿色数据中心
查看>>
Web开发初学指南
查看>>
OpenStack Days China:华云数据CTO郑军分享OpenStack创新实践
查看>>
探寻光存储没落的真正原因
查看>>
高通64位ARMv8系列服务器芯片商标命名:Centriq
查看>>
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.1 互联网经济系统的基本问题...
查看>>
盘点大数据商业智能的十大戒律
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>