根据字母进行索引排序应该是在很多APP都会用到的功能,其实现原理就是通过Fragment进行布局,将listview和TextView显示在一个页面上,通过继承的View绘制的图标来显示,效果图如下所示:
(1)首先需要下载一个公共包,其中包含SideBar的封装和显示内容的排序;下载地址:http://download.csdn.net/download/f552126367/10229053
(2)编写xml文件
(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 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 filledData(String [] date){
List mSortList = new ArrayList();
for(int i=0; i filterDateList = new ArrayList();
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文件,以供存储省市内容字段
- 北京市
- 天津市
- 石家庄市
- 唐山市
- 秦皇岛市
- 邯郸市
- 邢台市
- 保定市
- 张家口市
- 承德市
- 沧州市
- 廊坊市
- 衡水市
- 太原市
- 大同市
- 阳泉市
- 长治市
- 晋城市
- 朔州市
- 晋中市
- 运城市
- 忻州市
- 临汾市
- 吕梁市
- 呼和浩特市
- 包头市
- 乌海市
- 赤峰市
- 通辽市
- 鄂尔多斯市
- 呼伦贝尔市
- 巴彦淖尔市
- 乌兰察布市
- 兴安盟
- 锡林郭勒盟
- 阿拉善盟
- 沈阳市
- 大连市
- 鞍山市
- 抚顺市
- 本溪市
- 丹东市
- 锦州市
- 营口市
- 阜新市
- 辽阳市
- 盘锦市
- 铁岭市
- 朝阳市
- 葫芦岛市
- 长春市
- 吉林市
- 四平市
- 辽源市
- 通化市
- 白山市
- 松原市
- 白城市
- 延边朝鲜族自治州
- 哈尔滨市
- 齐齐哈尔市
- 鸡西市
- 鹤岗市
- 双鸭山市
- 大庆市
- 伊春市
- 佳木斯市
- 七台河市
- 牡丹江市
- 黑河市
- 绥化市
- 大兴安岭地区
- 上海市
- 南京市
- 无锡市
- 徐州市
- 常州市
- 苏州市
- 南通市
- 连云港市
- 淮安市
- 盐城市
- 扬州市
- 镇江市
- 泰州市
- 宿迁市
- 杭州市
- 宁波市
- 温州市
- 嘉兴市
- 湖州市
- 绍兴市
- 金华市
- 衢州市
- 舟山市
- 台州市
- 丽水市
- 合肥市
- 芜湖市
- 蚌埠市
- 淮南市
- 马鞍山市
- 淮北市
- 铜陵市
- 安庆市
- 黄山市
- 滁州市
- 阜阳市
- 宿州市
- 六安市
- 亳州市
- 池州市
- 宣城市
- 福州市
- 厦门市
- 莆田市
- 三明市
- 泉州市
- 漳州市
- 南平市
- 龙岩市
- 宁德市
- 南昌市
- 景德镇市
- 萍乡市
- 九江市
- 新余市
- 鹰潭市
- 赣州市
- 吉安市
- 宜春市
- 抚州市
- 上饶市
- 济南市
- 青岛市
- 淄博市
- 枣庄市
- 东营市
- 烟台市
- 潍坊市
- 济宁市
- 泰安市
- 威海市
- 日照市
- 莱芜市
- 临沂市
- 德州市
- 聊城市
- 滨州市
- 菏泽市
- 郑州市
- 开封市
- 洛阳市
- 平顶山市
- 安阳市
- 鹤壁市
- 新乡市
- 焦作市
- 濮阳市
- 许昌市
- 漯河市
- 三门峡市
- 南阳市
- 商丘市
- 信阳市
- 周口市
- 驻马店市
- 省直辖县级行政区划
- 武汉市
- 黄石市
- 十堰市
- 宜昌市
- 襄阳市
- 鄂州市
- 荆门市
- 孝感市
- 荆州市
- 黄冈市
- 咸宁市
- 随州市
- 恩施土家族苗族自治州
- 省直辖县级行政区划
- 长沙市
- 株洲市
- 湘潭市
- 衡阳市
- 邵阳市
- 岳阳市
- 常德市
- 张家界市
- 益阳市
- 郴州市
- 永州市
- 怀化市
- 娄底市
- 湘西土家族苗族自治州
- 广州市
- 韶关市
- 深圳市
- 珠海市
- 汕头市
- 佛山市
- 江门市
- 湛江市
- 茂名市
- 肇庆市
- 惠州市
- 梅州市
- 汕尾市
- 河源市
- 阳江市
- 清远市
- 东莞市
- 中山市
- 潮州市
- 揭阳市
- 云浮市
- 南宁市
- 柳州市
- 桂林市
- 梧州市
- 北海市
- 防城港市
- 钦州市
- 贵港市
- 玉林市
- 百色市
- 贺州市
- 河池市
- 来宾市
- 崇左市
- 海口市
- 三亚市
- 三沙市
- 省直辖县级行政区划
- 重庆市
- 成都市
- 自贡市
- 攀枝花市
- 泸州市
- 德阳市
- 绵阳市
- 广元市
- 遂宁市
- 内江市
- 乐山市
- 南充市
- 眉山市
- 宜宾市
- 广安市
- 达州市
- 雅安市
- 巴中市
- 资阳市
- 阿坝藏族羌族自治州
- 甘孜藏族自治州
- 凉山彝族自治州
- 贵阳市
- 六盘水市
- 遵义市
- 安顺市
- 毕节市
- 铜仁市
- 黔西南布依族苗族自治州
- 黔东南苗族侗族自治州
- 黔南布依族苗族自治州
- 昆明市
- 曲靖市
- 玉溪市
- 保山市
- 昭通市
- 丽江市
- 普洱市
- 临沧市
- 楚雄彝族自治州
- 红河哈尼族彝族自治州
- 文山壮族苗族自治州
- 西双版纳傣族自治州
- 大理白族自治州
- 德宏傣族景颇族自治州
- 怒江傈僳族自治州
- 迪庆藏族自治州
- 拉萨市
- 日喀则市
- 昌都地区
- 山南地区
- 那曲地区
- 阿里地区
- 林芝地区
- 西安市
- 铜川市
- 宝鸡市
- 咸阳市
- 渭南市
- 延安市
- 汉中市
- 榆林市
- 安康市
- 商洛市
- 兰州市
- 嘉峪关市
- 金昌市
- 白银市
- 天水市
- 武威市
- 张掖市
- 平凉市
- 酒泉市
- 庆阳市
- 定西市
- 陇南市
- 临夏回族自治州
- 甘南藏族自治州
- 西宁市
- 海东市
- 海北藏族自治州
- 黄南藏族自治州
- 海南藏族自治州
- 果洛藏族自治州
- 玉树藏族自治州
- 海西蒙古族藏族自治州
- 银川市
- 石嘴山市
- 吴忠市
- 固原市
- 中卫市
- 乌鲁木齐市
- 克拉玛依市
- 吐鲁番地区
- 哈密地区
- 昌吉回族自治州
- 博尔塔拉蒙古自治州
- 巴音郭楞蒙古自治州
- 阿克苏地区
- 克孜勒苏柯尔克孜自治州
- 喀什地区
- 和田地区
- 伊犁哈萨克自治州
- 塔城地区
- 阿勒泰地区
- 自治区直辖县级行政区划
- 台湾
- 香港
- 澳门
(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)
}