前言:曾经在一篇文章中记录了一下有关ListView快速检索的实现,今天还是用微信看到了它的联系人列表,利用午休的时间写一个简单的demo。
首先,先梳理一下逻辑流程:我们要实现的功能是滑动或者点击右侧的导航栏,在屏幕中央展示当前选择的首字母,ListView同时滑动到相应的部分。
导航栏的实现:与之前的demo类似,我们自定义一个控件继承TextView,重写onDraw方法以及事件处理。需要注意的是需要自定义一个接口,用于回调,接口定义如下:
public interface QuickSearchCallback { void onTouchDown(); void onTouchUp(); void onSelectStr(int index, String selectStr); }
其中,onTouchDown对应MotionEvent.ACTION_DOWN和 MotionEvent.ACTION_MOVE事件,可以理解为当用户手放在导航栏上的时候,显示中央的TextView,onTouchUp与onTouchDown正好相反。
onSelectStr则是界面重绘的时候触发,用于更新UI
界面效果:
关键代码:
1、城市列表排序
Comparator comparator= Collator.getInstance(java.util.Locale.CHINA); Collections.sort(users,comparator);
2、获取首字母
private String getFirst(String s) { String pinyin = Cn2Spell.getPinYin(s); String firstLetter = pinyin.substring(0, 1).toUpperCase(); // 获取拼音首字母并转成大写 if (!firstLetter.matches("[A-Z]")) { // 如果不在A-Z中则默认为“#” firstLetter = "#"; } return firstLetter; }
3、设置回调
扫描二维码关注公众号,回复:
3689506 查看本文章
bar.setOnQuickSearchCallback(new QuickSearchCallback() { @Override public void onTouchDown() { tv.setVisibility(View.VISIBLE); } @Override public void onTouchUp() { tv.setVisibility(View.GONE); } @Override public void onSelectStr(int index, String selectStr) { tv.setText(selectStr); for (int i = 0; i < users.size(); i++) { if (selectStr.equalsIgnoreCase(getFirst(users.get(i)))) { lv.setSelection(i); // 选择到首字母出现的位置 return; } } } });
最后,项目地址