Android实现字母索引查找地名、联系人(一)
2015-11-23 15:55
507 查看
在我们的智能手机使用中,经常会见到如联系人列表、城市名列表,需要寻找时,常见有两种方式:1、搜索,2、字母索引。今天我就分享下自己学习使用字母索引功能。Demo效果如下:
字母索引大体上实现原理为:
1)创建一个ListView(或者扩展ListV),展示联系人或城市、省份名;
2)在屏幕右边实现一个ListView,显示用作索引的字母;
3)当用户按下索引字母时,查找联系人或城市列表,找出第一个与之匹配的项,使listView跳转到该项。
代码实现如下:
1)显示城市名称
2)显示索引字母,这一段是动态添加的列表内容,包含点击某个字母,城市列表跳转到索引字母开始的城市
3)根据字母查找索引字母开始的城市,因为保存的城市名称是汉字,所以此次需要进行转换,把汉字名称转换为拼音,使用了pinyin4j开源库,城市名字在我另一篇博客里有分享,几乎包含了中国所有的城市名
4)调用pinyin4j开源库,将城市名称转换成拼音
布局文件如下(部分可忽略):
实现代码如下:
参考文章:
http://www.oschina.net/question/96894_24933
字母索引大体上实现原理为:
1)创建一个ListView(或者扩展ListV),展示联系人或城市、省份名;
2)在屏幕右边实现一个ListView,显示用作索引的字母;
3)当用户按下索引字母时,查找联系人或城市列表,找出第一个与之匹配的项,使listView跳转到该项。
代码实现如下:
1)显示城市名称
listView = (ListView) findViewById(R.id.listView); adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, android.R.id.text1, Cities.mCitiesStrings); listView.setAdapter(adapter); listView.setOnItemClickListener(itemClickListener);
2)显示索引字母,这一段是动态添加的列表内容,包含点击某个字母,城市列表跳转到索引字母开始的城市
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); for(final char letter:Letters){ TextView tv = new TextView(context); tv.setText(String.valueOf(letter)); tv.setGravity(Gravity.CENTER); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String index = ((TextView) v).getText().toString(); Log.d(TAG, "onClick.letter = " + index); listView.setSelection(getStartIndex(index)); } }); layout.addView(tv); }
3)根据字母查找索引字母开始的城市,因为保存的城市名称是汉字,所以此次需要进行转换,把汉字名称转换为拼音,使用了pinyin4j开源库,城市名字在我另一篇博客里有分享,几乎包含了中国所有的城市名
private int getStartIndex(String letter){ int returnInt = 0; char index = 0; for(int i=0;i<Letters.length;i++){ if(letter.equals(String.valueOf(Letters[i]))){ index = Letters[i]; break; } } for(int j = 0; j < Cities.mCitiesStrings.length; j++){ String cityName = getPinYin(Cities.mCitiesStrings[j]); Log.d(TAG, "getStartIndex.cityName = " + cityName); if((cityName.toCharArray())[0] == index) { returnInt = j; break; } } return returnInt; }
4)调用pinyin4j开源库,将城市名称转换成拼音
private String getPinYin(String inputString){ StringBuffer output = new StringBuffer(""); HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); format.setCaseType(HanyuPinyinCaseType.UPPERCASE); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); format.setVCharType(HanyuPinyinVCharType.WITH_V); char[] input = inputString.trim().toCharArray(); try { for(int i = 0; i < input.length; i++){ if (Character.toString(input[i]).matches("[\u4E00-\u9FA5]+")) { String[] temp = new String[0]; temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format); output.append(temp[0]); output.append(" "); } else output.append(Character.toString(input[i])); } } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) { badHanyuPinyinOutputFormatCombination.printStackTrace(); } return output.toString(); }
布局文件如下(部分可忽略):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/light" tools:context="com.huiyu.firstrankgas.ui.CityActivity"> <include layout="@layout/topbar_view"/> <!-- 搜索栏--> <LinearLayout android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:padding="5dp" android:background="@drawable/search_edit_bg" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="40dp"> <ImageView android:src="@drawable/search_icon" android:background="@color/light" android:layout_gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:layout_gravity="center" android:background="@null" android:layout_width="match_parent" android:layout_height="match_parent" android:hint="@string/search_hint" android:textSize="@dimen/text_size_middle_18"/> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:background="@color/white" android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/city" style="@style/text_style2" android:text="北京" android:layout_gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="30dp"/> <ListView android:id="@+id/listView" android:background="@color/white" android:dividerHeight="1dp" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> <LinearLayout android:id="@+id/letter_index" android:layout_gravity="right" android:orientation="vertical" android:layout_width="30dp" android:layout_height="match_parent"> </LinearLayout> </FrameLayout> </LinearLayout>
实现代码如下:
public class CityActivity extends Activity {
private static final String TAG = "CityActivity";
private char[] Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
private Context context;
private ListView listView;
private ArrayAdapter adapter;
private LinearLayout layout;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_city);
initView();
}
private void initView(){
context = CityActivity.this;
textView = (TextView) findViewById(R.id.city);
listView = (ListView) findViewById(R.id.listView); adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, android.R.id.text1, Cities.mCitiesStrings); listView.setAdapter(adapter); listView.setOnItemClickListener(itemClickListener);
layout = (LinearLayout) findViewById(R.id.letter_index);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); for(final char letter:Letters){ TextView tv = new TextView(context); tv.setText(String.valueOf(letter)); tv.setGravity(Gravity.CENTER); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String index = ((TextView) v).getText().toString(); Log.d(TAG, "onClick.letter = " + index); listView.setSelection(getStartIndex(index)); } }); layout.addView(tv); }
}
private int getStartIndex(String letter){ int returnInt = 0; char index = 0; for(int i=0;i<Letters.length;i++){ if(letter.equals(String.valueOf(Letters[i]))){ index = Letters[i]; break; } } for(int j = 0; j < Cities.mCitiesStrings.length; j++){ String cityName = getPinYin(Cities.mCitiesStrings[j]); Log.d(TAG, "getStartIndex.cityName = " + cityName); if((cityName.toCharArray())[0] == index) { returnInt = j; break; } } return returnInt; }
AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick() called with " + "parent = [" + parent + "], view = [" + view + "], position = [" + position + "], id = [" + id + "]");
String choice = Cities.mCitiesStrings[position];
Log.d(TAG, "onItemClick.choice = " + choice);
textView.setText(choice);
}
};
private String getPinYin(String inputString){ StringBuffer output = new StringBuffer(""); HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); format.setCaseType(HanyuPinyinCaseType.UPPERCASE); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); format.setVCharType(HanyuPinyinVCharType.WITH_V); char[] input = inputString.trim().toCharArray(); try { for(int i = 0; i < input.length; i++){ if (Character.toString(input[i]).matches("[\u4E00-\u9FA5]+")) { String[] temp = new String[0]; temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format); output.append(temp[0]); output.append(" "); } else output.append(Character.toString(input[i])); } } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) { badHanyuPinyinOutputFormatCombination.printStackTrace(); } return output.toString(); }
}
参考文章:
http://www.oschina.net/question/96894_24933
相关文章推荐
- android应用开发_通过手机QQ分享到空间出现分享错误的无奈原因
- android“设置”里的版本号
- android“设置”里的版本号
- 【1】14种Android Sensor
- 中科院开源协会镜像站 Android SDK镜像测试发布
- android 通过getDimension,getDimensionPixelOffset和getDimensionPixelSize获取dimens.xml文件里面的变量值
- Android开发进阶系列(三) 系统参数的获取和Broadcast
- Android 使用存放在存assets文件夹下的SQLite数据库
- Android Studio 快捷键
- Android libs中jar源码查看
- Android ListView+ScrollView显示和触摸冲突解决
- 获取android系统的一些功能
- Android高效加载大图、多图解决方案_LruCache,有效避免程序OOM
- android 获取屏幕的宽和高
- Android编程之菜单的实现方法实例详解
- Android中Bitmap和Drawable详解
- 【Android笔记】各个屏幕的logo尺寸要求
- Android学习----发行版本
- android 下拉菜单Spinner
- Android 实现可视化动态音频柱状图