【GT-安卓应用开发之仿微信联系人】

前言:曾经在一篇文章中记录了一下有关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;
            }
        }
    }
});

        最后,项目地址

猜你喜欢

转载自blog.csdn.net/qq_17433217/article/details/83180884