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)
}