简介
在android开发的过程中,列表是相当常用的组件,所以美观简单易用的列表是必须的。尤其在数据比较多的时候,索引和搜索功能就变得极为重要。例如android自带的联系人页面和一些App带的城市选择页面。
如下图为某团购网的城市选择页面。
但是纵观网上的大部分分组实现,数据都是诸如以下的形式(摘自某篇博客,或者这里只是说明基本的原理),分组标签和数据分开,不够典型。
public void setData(){
list.add("A");
listTag.add("A");
for(int i=0;i<3;i++){
list.add("阿凡达"+i);
}
list.add("B");
listTag.add("B");
for(int i=0;i<3;i++){
list.add("比特风暴"+i);
}
list.add("C");
listTag.add("C");
for(int i=0;i<30;i++){
list.add("查理风云"+i);
}
}
关于索引的实现大部分都不太完整,或者没有处理排序,或者假定是排序好的,对于一般的情况不太实用。本文将提供一种较为全面的实现。
功能分析
在开始实现之前,首先需要明确要实现的功能,才能进而一步步的实现。主要的功能有以下两个:
1. 所有的数据按照首字母排序并按首字母分组;
2. 右边的字母索引(以后也称为”尺子”)可以直接索引到相应的分组位置。
我们所要实现的也就是上面的两个功能。第一个功能需要把分组标签页插入到数据中,并设置分组标记,以便在生成列表的时候特殊处理;第二个功能则需要记录标签在数据中位置。可以细分为如下:
1. 汉字转拼音;
2. 按照首字母排序;
3. 所有的首字母集合;
4. 索引添加到数据集中,并记录索引在数据集合中的位置。
以上的功能分析中,分组标签也会添加到数据中,这个添加是动态完成的,不像简介中硬性添加。
实现思路
1. android提供的实现,HanziToPinyin.Java;
2. Collections.Sort()方法;
3. 遍历排序好的数据集,找出所有的首字母集合。
4. 可以和3同步进行。
实现
先加一张实现结果截图:
接下来一步步的实现。
1. 数据BO
首先是数据,为了简单,我们假定数据只有一个字段,那就是待排序和分组的字段。其他的均为辅助字段。
public class TestBo {
/** * 主要字段 */ private StringboStr =null;
/** * bo拼音缓存 */ private StringboPinYin =null; /** * Bo标签标记 */ private StringboTagFlag =null;
public TestBo() { super(); }
public TestBo(String str) { super(); this.boStr = str; } public String getSortStrPinyin() { returnboPinYin; }
public void setSortStrPinYin(String pinyin) { this.boPinYin = pinyin; }
public void setTag(String tag) { this.boTagFlag = tag; } public String getTag() { returnboTagFlag; } } |
2. 布局和activity
<?xmlversion="1.0"encoding="utf-8"?> <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- 主列表 --> <ListView android:id="@+id/g_base_list" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"/> <!-- 无数据提示 --> <TextView android:id="@+id/g_base_list_nodata" android:layout_width="fill_parent" android:layout_height="fill_parent" android:visibility="gone" android:gravity="center" android:text="@string/g_nodata" android:textSize="16sp"/> <!-- 加载进度框 |