Android 快速索引(城市列表和联系人)

最近需要实现一个城市列表的快速索引功能。类似于联系人应用,根据姓名首字母快速索引功能。

要实现这个功能只需要解决两个问题:

1、对列表进行分组(具有同一特征),并且能够快速定位到该组的第一项

2、右侧分组‘特征’快速索引栏的实现

第一个问题比较好解决,列表项可以根据相同的‘特征’来分组,比如说城市列表可以根据相同首字母的城市名来进行分组。

如何来定位到分组的第一项,只需要把分组的‘特征’和分组第一项下标关联起来,快速索引栏就能快速定位分组第一项

第二个问题可以通过自定义控件来实现,实现的形式有很多,可以通过绘制一整张分组‘特征’的图片(难以扩展),也可以动态来绘制每一个分组‘特征’(可扩展性强)

下面是一些实现的关键代码,基本上就是上面思想的体现,如果自己有特殊的需求话,稍做改动就能行

列表‘特征’和分组首项进行关联

        for (int i = 0; i < mCitys.size(); i++) {
            City city = mCitys.get(i);
            String cityId = city.getId();
            if(cityId == null || "".equals(cityId)) continue;
            String section = cityId.toUpperCase().substring(0, 1);
            if(!indexMap.containsKey(section)){
                indexMap.put(section, i);
            }
        }

快速索引的绘制

    @Override
    protected void onDraw(Canvas canvas) {
        heightCenter = getMeasuredHeight()/2 - preHeight*WORDS.length/2;
        for (int i = 0; i < WORDS.length; i++) {
            canvas.drawText(String.valueOf(WORDS[i]), getMeasuredWidth()/2, preHeight
                    + (i * preHeight) + heightCenter, mPaint);
        }
        super.onDraw(canvas);
    }

用户交互,快速定位到索引项

    public boolean onTouchEvent(MotionEvent event) {
        int startY = (int) event.getY() - heightCenter;
        int index = startY / preHeight;
        if (index >= WORDS.length) {
            index = WORDS.length - 1;
        } else if (index < 0) {
            index = 0;
        }
        if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
            int position = mSectionIndexter.getStartPositionOfSection(String.valueOf(WORDS[index]));
            if (position == -1) {
                return true;
            }
            mListView.setSelection(position);
        }
        return true;
    }

效果图如下:

源码:https://github.com/TUBB/CityIndex

时间: 2024-10-24 23:03:33

Android 快速索引(城市列表和联系人)的相关文章

获取全国城市列表 类似于联系人排序

获取全国城市列表 类似于联系人排序 中国城市列表,类似手机通讯录显示方式,可以通过触摸屏幕右边城市拼音首字母快速定位,还可通过中文.拼音快速查找. ** 修改demo在小米手机上排序错误的问题 需要的朋友可以参考一下! 下载地址:http://www.devstore.cn/code/info/602.html

ListView的快速索引

在玩即时通讯app比如微信的联系人列表的时候,发现联系人列表的右侧有个竖排的字母索引,点击字母,可以快速索引到相应的联系人.本篇就是实现这个功能. 效果图: 快速索引 快速索引 需要实现: 将右侧的字母画到屏幕上去: 联系人列表排序: 根据联系人名字的首字母为ListView打上TAG 选中索引的某个字母,出现相应的TAG下的联系人: 画索引字母到屏幕上 新建一个类,继承自View public class QuickIndexBar extends View 并提供构造器方法,在构造器中完成相

手机联系人快速索引

这是一个手机联系人快速索引的效果,总体来说代码不算难,拼音转换的地方略有复杂.下面上源码:源码中有注释. MainActivity: import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.

Android例子源码非第三方实现根据字母排序的城市列表

values 下dimens.xml <resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dime

android使用自定控件实现城市列表展示并且实现当前城市定位

自定义控件,点击控件,展示城市列表,使用百度地图定位当前城市,并且展示当前城市 代码类 package com.example.test0504; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import androi

UITableView---分组 省份城市列表+ 右列索引

UITableView分组显示省份城市列表+右侧索引 例题:分组名为省份名称,组内容为对应省份的城市名称,点击右边的索引,将对应的省份分组显示到到第一行. 显示效果如下: 对应plist文件如下图所示: #import "ViewController.h" //遵守协议 @interface ViewController () <UITableViewDelegate,UITableViewDataSource> //UITableView @property (nonat

8.快速索引、listview

实现这样的效果 布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools

快速索引

如下是快速索引的效果图,是从网上下的实例.如图实现的难点1:是最右侧的索引是用自定义View来实现的,主要通过onDraw的方法将其画出: 难点2:是如何拿到每个名字的首字母用的是pinyin4j-2.5.0.jar  将汉字转化成拼音再去第一个字符:难点3:ListView的adapte不好实现 下图的布局是一个ListView右侧是一个自定义的View,中间是一个TextView点击的时候显示 如下是自定义的View来实现快速索引 1 package com.demo.sb.widget;

JS实现带导航城市列表以及输入搜索功能

实现功能: 1.加载城市列表,并生成索引(没有该索引的城市则无索引) 2.点击索引滚动页面到对应索引城市第一个位置 3.输入搜索 分析: 1.加载城市很容易,生成对应的索引. 首先需要得到所有的城市,然后拿出城市的首字母,放入一个数组中,去重并排序, 得到无重复并有序的索引数组后加入到div中显示 2.根据索引进行页面滚动 需要给索引列表添加事件,由于锚点会在链接产生带#号的地址,以及页面会有刷动的效果,索引这里不使用锚点, 因此这里使用jquery或者js的方法进行页面自行滚动 3.进行搜索