android之ListView分组及字母索引导航

简介

在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"/>

    <!-- 加载进度框

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值