Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音





package com.example.sortlistview;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.sortlistview.SideBar.OnTouchingLetterChangedListener;
public class MainActivity extends Activity {
private ListView sortListView;
private SideBar sideBar;
private TextView dialog;
private SortAdapter adapter;
private ClearEditText mClearEditText;
/**
* 汉字转换成拼音的类
*/
private CharacterParser characterParser;
private List<SortModel> SourceDateList;
/**
* 根据拼音来排列ListView里面的数据类
*/
private PinyinComparator pinyinComparator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
//实例化汉字转拼音类
characterParser = CharacterParser.getInstance();
pinyinComparator = new PinyinComparator();
sideBar = (SideBar) findViewById(R.id.sidrbar);
dialog = (TextView) findViewById(R.id.dialog);
sideBar.setTextView(dialog);
//设置右侧触摸监听
sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
@Override
public void onTouchingLetterChanged(String s) {
//该字母首次出现的位置
int position = adapter.getPositionForSection(s.charAt(0));
if(position != -1){
sortListView.setSelection(position);
}
}
});
sortListView = (ListView) 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所对应的对象
Toast.makeText(getApplication(), ((SortModel)adapter.getItem(position)).getName(), Toast.LENGTH_SHORT).show();
}
});
SourceDateList = filledData(getResources().getStringArray(R.array.date));
// 根据a-z进行排序源数据
Collections.sort(SourceDateList, pinyinComparator);
adapter = new SortAdapter(this, SourceDateList);
sortListView.setAdapter(adapter);
mClearEditText = (ClearEditText) 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.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith(filterStr.toString())){
filterDateList.add(sortModel);
}
}
}
// 根据a-z进行排序
Collections.sort(filterDateList, pinyinComparator);
adapter.updateListView(filterDateList);
}
}
资源文件列表
.project , 848
.settings/org.eclipse.jdt.core.prefs , 177
AndroidManifest.xml , 942
bin/AndroidManifest.xml , 942
bin/classes.dex , 471436
bin/classes/com/example/sortlistview/BuildConfig.class , 357
bin/classes/com/example/sortlistview/CharacterParser.class , 12672
bin/classes/com/example/sortlistview/ClearEditText.class , 4192
bin/classes/com/example/sortlistview/MainActivity$1.class , 1333
bin/classes/com/example/sortlistview/MainActivity$2.class , 1669
bin/classes/com/example/sortlistview/MainActivity$3.class , 1234
bin/classes/com/example/sortlistview/MainActivity.class , 5378
bin/classes/com/example/sortlistview/PinyinComparator.class , 1107
bin/classes/com/example/sortlistview/R$array.class , 409
bin/classes/com/example/sortlistview/R$attr.class , 358
bin/classes/com/example/sortlistview/R$drawable.class , 750
bin/classes/com/example/sortlistview/R$id.class , 606
bin/classes/com/example/sortlistview/R$layout.class , 449
bin/classes/com/example/sortlistview/R$menu.class , 415
bin/classes/com/example/sortlistview/R$string.class , 488
bin/classes/com/example/sortlistview/R$style.class , 449
bin/classes/com/example/sortlistview/R.class , 733
bin/classes/com/example/sortlistview/SideBar$OnTouchingLetterChangedListener.class , 313
bin/classes/com/example/sortlistview/SideBar.class , 4207
bin/classes/com/example/sortlistview/SortAdapter$ViewHolder.class , 481
bin/classes/com/example/sortlistview/SortAdapter.class , 3644
bin/classes/com/example/sortlistview/SortModel.class , 755
bin/dexedLibs/android-support-v4-c0b27c86b819efc13636c97e5096b2bf.jar , 149766
bin/dexedLibs/android-support-v4-e0b48c22eb0810b27455e66d4308c0f6.jar , 149766
bin/jarlist.cache , 119
bin/MainActivity.apk , 203402
bin/resources.ap_ , 38750
bin/res/drawable-hdpi/emotionstore_progresscancelbtn.png , 1058
bin/res/drawable-hdpi/ic_launcher.png , 6299
bin/res/drawable-hdpi/search_bar_icon_normal.png , 598
bin/res/drawable-hdpi/show_head_toast_bg.9.PNG , 2064
bin/res/drawable-ldpi/ic_launcher.png , 2171
bin/res/drawable-mdpi/ic_launcher.png , 3296
bin/res/drawable-xhdpi/ic_launcher.png , 10087
bin/SortListView.apk , 192420
gen/com/example/sortlistview/BuildConfig.java , 166
gen/com/example/sortlistview/R.java , 3007
ic_launcher-web.png , 55743
libs/android-support-v4.jar , 385685
proguard-project.txt , 781
project.properties , 563
res/drawable-hdpi/emotionstore_progresscancelbtn.png , 1058
res/drawable-hdpi/ic_launcher.png , 8217
res/drawable-hdpi/search_bar_edit_normal.9.png , 1801
res/drawable-hdpi/search_bar_edit_pressed.9.png , 1935
res/drawable-hdpi/search_bar_icon_normal.png , 598
res/drawable-hdpi/show_head_toast_bg.9.PNG , 3549
res/drawable-ldpi/ic_launcher.png , 2557
res/drawable-mdpi/ic_launcher.png , 4062
res/drawable-xhdpi/ic_launcher.png , 13563
res/drawable/search_bar_edit_selector.xml , 395
res/drawable/sidebar_background.xml , 353
res/layout/activity_main.xml , 1752
res/layout/item.xml , 1134
res/menu/activity_main.xml , 257
res/values-v11/styles.xml , 332
res/values-v14/styles.xml , 389
res/values/arrays.xml , 1442
res/values/strings.xml , 225
res/values/styles.xml , 695
src/com/example/sortlistview/CharacterParser.java , 8463
src/com/example/sortlistview/ClearEditText.java , 4317
src/com/example/sortlistview/MainActivity.java , 4534
src/com/example/sortlistview/PinyinComparator.java , 518
src/com/example/sortlistview/SideBar.java , 3542
src/com/example/sortlistview/SortAdapter.java , 2996
src/com/example/sortlistview/SortModel.java , 425
