Android使用SideBar根据字母A~Z进行城市的排序

1、前言

根据字母进行索引排序应该是在很多APP都会用到的功能,其实现原理就是通过Fragment进行布局,将listview和TextView显示在一个页面上,通过继承的View绘制的图标来显示,效果图如下所示:

2、实现方式

(1)首先需要下载一个公共包,其中包含SideBar的封装和显示内容的排序;下载地址:http://download.csdn.net/download/f552126367/10229053

(2)编写xml文件

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <ListView
        android:id="@+id/country_lvcountry"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:dividerHeight="1dp"
        android:divider="@color/gray_background"
        android:listSelector="#00000000"
        android:background="@color/white">
    </ListView>
    <TextView
        android:id="@+id/dialog"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_gravity="center"
        android:background="@color/black"
        android:gravity="center"
        android:textColor="#ffffffff"
        android:textSize="30.0dip"
        android:visibility="invisible" />
    <com.PinyinSort.SideBar
        android:id="@+id/sidrbar"
        android:layout_width="30.0dip"
        android:layout_height="fill_parent"
        android:layout_gravity="right|center" />
</FrameLayout>

(3)编写完xml文件后,需要编写java主类

public class CitySelectActivity extends Activity {
    private ListView sortListView;
    private SideBar sideBar;
    /**
     * 显示字母的TextView
     */
    private TextView dialog;
    private SortAdapter adapter;
    private EditText mClearEditText;

    /**
     * 汉字转换成拼音的类
     */
    private CharacterParser characterParser;
    private List<SortModel> SourceDateList;
    /**
     * 根据拼音来排列ListView里面的数据类
     */
    private PinyinComparator pinyinComparator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pinyin_activity_main);
        initViews();
    }

    private void initViews() {
        //实例化汉字转拼音类
        characterParser = CharacterParser.getInstance();
        pinyinComparator = new PinyinComparator();
        sideBar = findViewById(R.id.sidrbar);
        dialog =  findViewById(R.id.dialog);
        sideBar.setTextView(dialog);

        //设置右侧触摸监听
        sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {

            @Override
            public void onTouchingLetterChanged(String s) {
                //该字母首次出现的位置
                int position = adapter.getPositionForSection(s.charAt(0));
                if(position != -1){
                    sortListView.setSelection(position);
                }
            }
        });

        sortListView = findViewById(R.id.country_lvcountry);
        sortListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                //这里要利用adapter.getItem(position)来获取当前position所对应的对象
                Intent intent = new Intent();
                intent.putExtra("city",((SortModel)adapter.getItem(position)).getName());
                setResult(1001,intent);
                finish();
            }
        });

        SourceDateList = filledData(getResources().getStringArray(R.array.date));

        // 根据a-z进行排序源数据
        Collections.sort(SourceDateList, pinyinComparator);
        adapter = new SortAdapter(this, SourceDateList);
        sortListView.setAdapter(adapter);


        mClearEditText = findViewById(R.id.filter_edit);

        //根据输入框输入值的改变来过滤搜索
        mClearEditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
                filterData(s.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                                          int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }


    /**
     * 为ListView填充数据
     * @param date
     * @return
     */
    private List<SortModel> filledData(String [] date){
        List<SortModel> mSortList = new ArrayList<SortModel>();

        for(int i=0; i<date.length; i++){
            SortModel sortModel = new SortModel();
            sortModel.setName(date[i]);
            //汉字转换成拼音
            String pinyin = characterParser.getSelling(date[i]);
            String sortString = pinyin.substring(0, 1).toUpperCase();

            // 正则表达式,判断首字母是否是英文字母
            if(sortString.matches("[A-Z]")){
                sortModel.setSortLetters(sortString.toUpperCase());
            }else{
                sortModel.setSortLetters("#");
            }

            mSortList.add(sortModel);
        }
        return mSortList;

    }

    /**
     * 根据输入框中的值来过滤数据并更新ListView
     * @param filterStr
     */
    private void filterData(String filterStr) {
        List<SortModel> filterDateList = new ArrayList<SortModel>();

        if (TextUtils.isEmpty(filterStr)) {
            filterDateList = SourceDateList;
        } else {
            filterDateList.clear();
            for (SortModel sortModel : SourceDateList) {
                String name = sortModel.getName();
                if (name.toUpperCase().indexOf(
                        filterStr.toString().toUpperCase()) != -1
                        || characterParser.getSelling(name).toUpperCase()
                        .startsWith(filterStr.toString().toUpperCase())) {
                    filterDateList.add(sortModel);
                }
            }
        }

        // 根据a-z进行排序
        Collections.sort(filterDateList, pinyinComparator);
        adapter.updateListView(filterDateList);
    }

}

4、其中读取的内容:在values中写一个arrays.xml文件,以供存储省市内容字段

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="date">
        <item>北京市</item>
        <item>天津市</item>
        <item>石家庄市</item>
        <item>唐山市</item>
        <item>秦皇岛市</item>
        <item>邯郸市</item>
        <item>邢台市</item>
        <item>保定市</item>
        <item>张家口市</item>
        <item>承德市</item>
        <item>沧州市</item>
        <item>廊坊市</item>
        <item>衡水市</item>
        <item>太原市</item>
        <item>大同市</item>
        <item>阳泉市</item>
        <item>长治市</item>
        <item>晋城市</item>
        <item>朔州市</item>
        <item>晋中市</item>
        <item>运城市</item>
        <item>忻州市</item>
        <item>临汾市</item>
        <item>吕梁市</item>
        <item>呼和浩特市</item>
        <item>包头市</item>
        <item>乌海市</item>
        <item>赤峰市</item>
        <item>通辽市</item>
        <item>鄂尔多斯市</item>
        <item>呼伦贝尔市</item>
        <item>巴彦淖尔市</item>
        <item>乌兰察布市</item>
        <item>兴安盟</item>
        <item>锡林郭勒盟</item>
        <item>阿拉善盟</item>
        <item>沈阳市</item>
        <item>大连市</item>
        <item>鞍山市</item>
        <item>抚顺市</item>
        <item>本溪市</item>
        <item>丹东市</item>
        <item>锦州市</item>
        <item>营口市</item>
        <item>阜新市</item>
        <item>辽阳市</item>
        <item>盘锦市</item>
        <item>铁岭市</item>
        <item>朝阳市</item>
        <item>葫芦岛市</item>
        <item>长春市</item>
        <item>吉林市</item>
        <item>四平市</item>
        <item>辽源市</item>
        <item>通化市</item>
        <item>白山市</item>
        <item>松原市</item>
        <item>白城市</item>
        <item>延边朝鲜族自治州</item>
        <item>哈尔滨市</item>
        <item>齐齐哈尔市</item>
        <item>鸡西市</item>
        <item>鹤岗市</item>
        <item>双鸭山市</item>
        <item>大庆市</item>
        <item>伊春市</item>
        <item>佳木斯市</item>
        <item>七台河市</item>
        <item>牡丹江市</item>
        <item>黑河市</item>
        <item>绥化市</item>
        <item>大兴安岭地区</item>
        <item>上海市</item>
        <item>南京市</item>
        <item>无锡市</item>
        <item>徐州市</item>
        <item>常州市</item>
        <item>苏州市</item>
        <item>南通市</item>
        <item>连云港市</item>
        <item>淮安市</item>
        <item>盐城市</item>
        <item>扬州市</item>
        <item>镇江市</item>
        <item>泰州市</item>
        <item>宿迁市</item>
        <item>杭州市</item>
        <item>宁波市</item>
        <item>温州市</item>
        <item>嘉兴市</item>
        <item>湖州市</item>
        <item>绍兴市</item>
        <item>金华市</item>
        <item>衢州市</item>
        <item>舟山市</item>
        <item>台州市</item>
        <item>丽水市</item>
        <item>合肥市</item>
        <item>芜湖市</item>
        <item>蚌埠市</item>
        <item>淮南市</item>
        <item>马鞍山市</item>
        <item>淮北市</item>
        <item>铜陵市</item>
        <item>安庆市</item>
        <item>黄山市</item>
        <item>滁州市</item>
        <item>阜阳市</item>
        <item>宿州市</item>
        <item>六安市</item>
        <item>亳州市</item>
        <item>池州市</item>
        <item>宣城市</item>
        <item>福州市</item>
        <item>厦门市</item>
        <item>莆田市</item>
        <item>三明市</item>
        <item>泉州市</item>
        <item>漳州市</item>
        <item>南平市</item>
        <item>龙岩市</item>
        <item>宁德市</item>
        <item>南昌市</item>
        <item>景德镇市</item>
        <item>萍乡市</item>
        <item>九江市</item>
        <item>新余市</item>
        <item>鹰潭市</item>
        <item>赣州市</item>
        <item>吉安市</item>
        <item>宜春市</item>
        <item>抚州市</item>
        <item>上饶市</item>
        <item>济南市</item>
        <item>青岛市</item>
        <item>淄博市</item>
        <item>枣庄市</item>
        <item>东营市</item>
        <item>烟台市</item>
        <item>潍坊市</item>
        <item>济宁市</item>
        <item>泰安市</item>
        <item>威海市</item>
        <item>日照市</item>
        <item>莱芜市</item>
        <item>临沂市</item>
        <item>德州市</item>
        <item>聊城市</item>
        <item>滨州市</item>
        <item>菏泽市</item>
        <item>郑州市</item>
        <item>开封市</item>
        <item>洛阳市</item>
        <item>平顶山市</item>
        <item>安阳市</item>
        <item>鹤壁市</item>
        <item>新乡市</item>
        <item>焦作市</item>
        <item>濮阳市</item>
        <item>许昌市</item>
        <item>漯河市</item>
        <item>三门峡市</item>
        <item>南阳市</item>
        <item>商丘市</item>
        <item>信阳市</item>
        <item>周口市</item>
        <item>驻马店市</item>
        <item>省直辖县级行政区划</item>
        <item>武汉市</item>
        <item>黄石市</item>
        <item>十堰市</item>
        <item>宜昌市</item>
        <item>襄阳市</item>
        <item>鄂州市</item>
        <item>荆门市</item>
        <item>孝感市</item>
        <item>荆州市</item>
        <item>黄冈市</item>
        <item>咸宁市</item>
        <item>随州市</item>
        <item>恩施土家族苗族自治州</item>
        <item>省直辖县级行政区划</item>
        <item>长沙市</item>
        <item>株洲市</item>
        <item>湘潭市</item>
        <item>衡阳市</item>
        <item>邵阳市</item>
        <item>岳阳市</item>
        <item>常德市</item>
        <item>张家界市</item>
        <item>益阳市</item>
        <item>郴州市</item>
        <item>永州市</item>
        <item>怀化市</item>
        <item>娄底市</item>
        <item>湘西土家族苗族自治州</item>
        <item>广州市</item>
        <item>韶关市</item>
        <item>深圳市</item>
        <item>珠海市</item>
        <item>汕头市</item>
        <item>佛山市</item>
        <item>江门市</item>
        <item>湛江市</item>
        <item>茂名市</item>
        <item>肇庆市</item>
        <item>惠州市</item>
        <item>梅州市</item>
        <item>汕尾市</item>
        <item>河源市</item>
        <item>阳江市</item>
        <item>清远市</item>
        <item>东莞市</item>
        <item>中山市</item>
        <item>潮州市</item>
        <item>揭阳市</item>
        <item>云浮市</item>
        <item>南宁市</item>
        <item>柳州市</item>
        <item>桂林市</item>
        <item>梧州市</item>
        <item>北海市</item>
        <item>防城港市</item>
        <item>钦州市</item>
        <item>贵港市</item>
        <item>玉林市</item>
        <item>百色市</item>
        <item>贺州市</item>
        <item>河池市</item>
        <item>来宾市</item>
        <item>崇左市</item>
        <item>海口市</item>
        <item>三亚市</item>
        <item>三沙市</item>
        <item>省直辖县级行政区划</item>
        <item>重庆市</item>
        <item>成都市</item>
        <item>自贡市</item>
        <item>攀枝花市</item>
        <item>泸州市</item>
        <item>德阳市</item>
        <item>绵阳市</item>
        <item>广元市</item>
        <item>遂宁市</item>
        <item>内江市</item>
        <item>乐山市</item>
        <item>南充市</item>
        <item>眉山市</item>
        <item>宜宾市</item>
        <item>广安市</item>
        <item>达州市</item>
        <item>雅安市</item>
        <item>巴中市</item>
        <item>资阳市</item>
        <item>阿坝藏族羌族自治州</item>
        <item>甘孜藏族自治州</item>
        <item>凉山彝族自治州</item>
        <item>贵阳市</item>
        <item>六盘水市</item>
        <item>遵义市</item>
        <item>安顺市</item>
        <item>毕节市</item>
        <item>铜仁市</item>
        <item>黔西南布依族苗族自治州</item>
        <item>黔东南苗族侗族自治州</item>
        <item>黔南布依族苗族自治州</item>
        <item>昆明市</item>
        <item>曲靖市</item>
        <item>玉溪市</item>
        <item>保山市</item>
        <item>昭通市</item>
        <item>丽江市</item>
        <item>普洱市</item>
        <item>临沧市</item>
        <item>楚雄彝族自治州</item>
        <item>红河哈尼族彝族自治州</item>
        <item>文山壮族苗族自治州</item>
        <item>西双版纳傣族自治州</item>
        <item>大理白族自治州</item>
        <item>德宏傣族景颇族自治州</item>
        <item>怒江傈僳族自治州</item>
        <item>迪庆藏族自治州</item>
        <item>拉萨市</item>
        <item>日喀则市</item>
        <item>昌都地区</item>
        <item>山南地区</item>
        <item>那曲地区</item>
        <item>阿里地区</item>
        <item>林芝地区</item>
        <item>西安市</item>
        <item>铜川市</item>
        <item>宝鸡市</item>
        <item>咸阳市</item>
        <item>渭南市</item>
        <item>延安市</item>
        <item>汉中市</item>
        <item>榆林市</item>
        <item>安康市</item>
        <item>商洛市</item>
        <item>兰州市</item>
        <item>嘉峪关市</item>
        <item>金昌市</item>
        <item>白银市</item>
        <item>天水市</item>
        <item>武威市</item>
        <item>张掖市</item>
        <item>平凉市</item>
        <item>酒泉市</item>
        <item>庆阳市</item>
        <item>定西市</item>
        <item>陇南市</item>
        <item>临夏回族自治州</item>
        <item>甘南藏族自治州</item>
        <item>西宁市</item>
        <item>海东市</item>
        <item>海北藏族自治州</item>
        <item>黄南藏族自治州</item>
        <item>海南藏族自治州</item>
        <item>果洛藏族自治州</item>
        <item>玉树藏族自治州</item>
        <item>海西蒙古族藏族自治州</item>
        <item>银川市</item>
        <item>石嘴山市</item>
        <item>吴忠市</item>
        <item>固原市</item>
        <item>中卫市</item>
        <item>乌鲁木齐市</item>
        <item>克拉玛依市</item>
        <item>吐鲁番地区</item>
        <item>哈密地区</item>
        <item>昌吉回族自治州</item>
        <item>博尔塔拉蒙古自治州</item>
        <item>巴音郭楞蒙古自治州</item>
        <item>阿克苏地区</item>
        <item>克孜勒苏柯尔克孜自治州</item>
        <item>喀什地区</item>
        <item>和田地区</item>
        <item>伊犁哈萨克自治州</item>
        <item>塔城地区</item>
        <item>阿勒泰地区</item>
        <item>自治区直辖县级行政区划</item>
        <item>台湾</item>
        <item>香港</item>
        <item>澳门</item>
    </string-array>
</resources>

4、读取资源文件xml的方法

(1)xml格式如上图所示,xml存放位置应存放于values下。

(2)代码读取方式:

val data=resources.getStringArray(R.array.date)
 for(i in data.indices){
     val ii=data[i]
     Log.i("feng",ii)
 }

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值