1.需要下载Pinyin4j的jar包。下载地址为https://sourceforge.net/projects/pinyin4j/files/
下载后需要放到安卓项目目录下的libs文件夹。如下图片所示
然后还需要依赖这个jar包。不会导包的Android Studio导入jar包或aar包看这个链接。https://blog.csdn.net/qq_36570506/article/details/128019219
基本用法:
通常情况下,只需要用到其中的PinyinHelper类中的静态方法toHanyuPinyinStringArray就可以了,比如:
String[] pinyinArray =PinyinHelper.toHanyuPinyinStringArray(‘单’);
for(int i = 0; i < pinyinArray.length; ++i)
{
System.out.println(pinyinArray[i]);
}
就会输出:
dan1
chan2
shan4
这三种发音,后面的数字代表第几声。可以看到静态方法toHanyuPinyinStringArray返回的数据类型是一个String数组,它用来接收一个汉字的多个发音,如果toHanyuPinyinStringArray中的参数不是汉字,那么它会返回null。
2.上面的第一步,只是为了给城市名称转换成拼音输出,好为了城市名称按首字母排序,有了第一步的拼音,只需要将拼音的字符串截取第一位字母即可排序。排序见MainActivity类对象里面
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.myapplication001.R.id;
import com.bumptech.glide.Glide;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
public class MainActivity extends AppCompatActivity implements LetterSideBar.OnTouchLetterListener {
private ImageView view;
private TextView tv;
private ListView listView;
private LetterSideBar letterSideBar;
private TextView textView;
/**
* 没有排序,旧的数据
*/
private List<CityBean> mCities = new ArrayList();
/**
* 排序后的,新的数据
*/
private List<CityBean> all_mCities = new ArrayList();
private CityAdapter mAdapter;
//----------------------------------------------------------------------------------------------
//26个字母
private List<CityBean> list_a = new ArrayList();
private List<CityBean> list_b = new ArrayList();
private List<CityBean> list_c = new ArrayList();
private List<CityBean> list_d = new ArrayList();
private List<CityBean> list_e = new ArrayList();
private List<CityBean> list_f = new ArrayList();
private List<CityBean> list_g = new ArrayList();
private List<CityBean> list_h = new ArrayList();
private List<CityBean> list_i = new ArrayList();
private List<CityBean> list_j = new ArrayList();
private List<CityBean> list_k = new ArrayList();
private List<CityBean> list_l = new ArrayList();
private List<CityBean> list_m = new ArrayList();
private List<CityBean> list_n = new ArrayList();
private List<CityBean> list_o = new ArrayList();
private List<CityBean> list_p = new ArrayList();
private List<CityBean> list_q = new ArrayList();
private List<CityBean> list_r = new ArrayList();
private List<CityBean> list_s = new ArrayList();
private List<CityBean> list_t = new ArrayList();
private List<CityBean> list_u = new ArrayList();
private List<CityBean> list_v = new ArrayList();
private List<CityBean> list_w = new ArrayList();
private List<CityBean> list_x = new ArrayList();
private List<CityBean> list_y = new ArrayList();
private List<CityBean> list_z = new ArrayList();
//----------------------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.name);
listView = (ListView) findViewById(R.id.id_lv_citysa);
letterSideBar = (LetterSideBar) findViewById(R.id.id_ls_sidebara);
textView = (TextView) findViewById(R.id.id_tv_maska);
// CityListActivity.startCityActivityForResult(MainActivity.this);
// for (int i=0;i<6;i++){
// CityBean cityBean13=new CityBean();
// cityBean13.setId(0);
// cityBean13.setName("v他素");
// // cityBean13.setPinyin("haikou");
// cityBean13.setPinyin("v");
// this.mCities.add(cityBean13);
// }
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("青岛");
// cityBean0.setPinyin("qingdao");
// cityBean0.setPinyin("q");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean=new CityBean();
cityBean.setId(i);
cityBean.setName("佛山");
// cityBean.setPinyin("foshan");
// cityBean.setPinyin("f");
this.mCities.add(cityBean);
}
// for (int i=0;i<6;i++){
// CityBean cityBean0=new CityBean();
// cityBean0.setId(0);
// cityBean0.setName("U型管");
// // cityBean0.setPinyin("uxingguan");
// cityBean0.setPinyin("u");
// this.mCities.add(cityBean0);
// }
// for (int i=0;i<6;i++){
// CityBean cityBean0=new CityBean();
// cityBean0.setId(0);
// cityBean0.setName("id");
// // cityBean0.setPinyin("id");
// cityBean0.setPinyin("i");
// this.mCities.add(cityBean0);
// }
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("北京");
// cityBean0.setPinyin("beijing");
// cityBean0.setPinyin("b");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("日本");
// cityBean0.setPinyin("riben");
// cityBean0.setPinyin("r");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("草本植物");
// cityBean0.setPinyin("caobenzhiwu");
// cityBean0.setPinyin("c");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("台湾");
// cityBean0.setPinyin("taiwan");
// cityBean0.setPinyin("t");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("峨眉山");
// cityBean0.setPinyin("emeishan");
// cityBean0.setPinyin("e");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("江门");
// cityBean0.setPinyin("jiangmen");
// cityBean0.setPinyin("j");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("昆明");
// cityBean0.setPinyin("kunming");
// cityBean0.setPinyin("k");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("兰州");
// cityBean0.setPinyin("lanzhou");
// cityBean0.setPinyin("l");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("茂名");
// cityBean0.setPinyin("maoming");
// cityBean0.setPinyin("m");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("南京");
// cityBean0.setPinyin("nanjing");
// cityBean0.setPinyin("n");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("欧洲");
// cityBean0.setPinyin("ouzhou");
// cityBean0.setPinyin("o");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean0=new CityBean();
cityBean0.setId(0);
cityBean0.setName("判断");
// cityBean0.setPinyin("panyu");
// cityBean0.setPinyin("p");
this.mCities.add(cityBean0);
}
for (int i=0;i<6;i++){
CityBean cityBean1=new CityBean();
cityBean1.setId(0);
cityBean1.setName("暗凯");
// cityBean1.setPinyin("ankai");
// cityBean1.setPinyin("a");
this.mCities.add(cityBean1);
}
for (int i=0;i<6;i++){
CityBean cityBean12=new CityBean();
cityBean12.setId(0);
cityBean12.setName("德州");
// cityBean12.setPinyin("dezhou");
// cityBean12.setPinyin("d");
this.mCities.add(cityBean12);
}
for (int i=0;i<6;i++){
CityBean cityBean13=new CityBean();
cityBean13.setId(0);
cityBean13.setName("海口");
// cityBean13.setPinyin("haikou");
// cityBean13.setPinyin("h");
this.mCities.add(cityBean13);
}
for (int i=0;i<6;i++){
CityBean cityBean14=new CityBean();
cityBean14.setId(0);
cityBean14.setName("烟台");
// cityBean14.setPinyin("yantai");
// cityBean14.setPinyin("y");
this.mCities.add(cityBean14);
}
for (int i=0;i<6;i++){
CityBean cityBean15=new CityBean();
cityBean15.setId(0);
cityBean15.setName("张家口");
// cityBean15.setPinyin("zhangjiakou");
// cityBean15.setPinyin("z");
this.mCities.add(cityBean15);
}
for (int i=0;i<6;i++){
CityBean cityBean16=new CityBean();
cityBean16.setId(0);
cityBean16.setName("瞎子");
// cityBean16.setPinyin("xiamen");
// cityBean16.setPinyin("x");
this.mCities.add(cityBean16);
}
for (int i=0;i<6;i++){
CityBean cityBean17=new CityBean();
cityBean17.setId(0);
cityBean17.setName("文山");
// cityBean17.setPinyin("wenshan");
// cityBean17.setPinyin("w");
this.mCities.add(cityBean17);
}
for (int i=0;i<6;i++){
CityBean cityBean18=new CityBean();
cityBean18.setId(0);
cityBean18.setName("三亚");
// cityBean18.setPinyin("sanya");
// cityBean18.setPinyin("s");
this.mCities.add(cityBean18);
}
for (int i=0;i<6;i++){
CityBean cityBean=new CityBean();
cityBean.setId(i);
cityBean.setName("广州");
// cityBean.setPinyin("guangzhou");
// cityBean.setPinyin("g");
this.mCities.add(cityBean);
}
//------------------------------------------------------------------------------------------
//在这里给城市名称设置拼音
Log.v("拼音输出2", "打印 all_mCities.size()="+mCities.size());
for(int i = 0; i < mCities.size(); ++i)
{ /**
* 得到多个拼音数组,多音字
*/
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(mCities.get(i).getName().charAt(0));//只要城市名称的第一个字
// Log.v("拼音输出2", "打印数组大小 "+pinyinArray.length);
Log.v("拼音输出2", "只要打印拼音1 "+pinyinArray[0].charAt(0));//这里只要多音字数组中的第一个,并且只要拼音字符串里的第一个字母
//给城市名称列表设置拼音,只要拼音字符串里的第一个字母
mCities.get(i).setPinyin(pinyinArray[0].charAt(0)+"");
}
//------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//在这里排序 总共有这么多数据
for(int i=0;i<mCities.size();i++){
switch (mCities.get(i).getPinyin()){
case "a" :
list_a.add(mCities.get(i));
break;
case "b" :
list_b.add(mCities.get(i));
break;
case "c" :
list_c.add(mCities.get(i));
break;
case "d" :
list_d.add(mCities.get(i));
break;
case "e" :
list_e.add(mCities.get(i));
break;
case "f" :
list_f.add(mCities.get(i));
break;
case "g" :
list_g.add(mCities.get(i));
break;
case "h" :
list_h.add(mCities.get(i));
break;
case "i" :
list_i.add(mCities.get(i));
break;
case "j" :
list_j.add(mCities.get(i));
break;
case "k" :
list_k.add(mCities.get(i));
break;
case "l" :
list_l.add(mCities.get(i));
break;
case "m" :
list_m.add(mCities.get(i));
break;
case "n" :
list_n.add(mCities.get(i));
break;
case "o" :
list_o.add(mCities.get(i));
break;
case "p" :
list_p.add(mCities.get(i));
break;
case "q" :
list_q.add(mCities.get(i));
break;
case "r" :
list_r.add(mCities.get(i));
break;
case "s" :
list_s.add(mCities.get(i));
break;
case "t" :
list_t.add(mCities.get(i));
break;
case "u" :
list_u.add(mCities.get(i));
break;
case "v" :
list_v.add(mCities.get(i));
break;
case "w" :
list_w.add(mCities.get(i));
break;
case "x" :
list_x.add(mCities.get(i));
break;
case "y" :
list_y.add(mCities.get(i));
break;
case "z" :
list_z.add(mCities.get(i));
break;
}
}
all_mCities.addAll(list_a);
all_mCities.addAll(list_b);
all_mCities.addAll(list_c);
all_mCities.addAll(list_d);
all_mCities.addAll(list_e);
all_mCities.addAll(list_f);
all_mCities.addAll(list_g);
all_mCities.addAll(list_h);
all_mCities.addAll(list_i);
all_mCities.addAll(list_j);
all_mCities.addAll(list_k);
all_mCities.addAll(list_l);
all_mCities.addAll(list_m);
all_mCities.addAll(list_n);
all_mCities.addAll(list_o);
all_mCities.addAll(list_p);
all_mCities.addAll(list_q);
all_mCities.addAll(list_r);
all_mCities.addAll(list_s);
all_mCities.addAll(list_t);
all_mCities.addAll(list_u);
all_mCities.addAll(list_v);
all_mCities.addAll(list_w);
all_mCities.addAll(list_x);
all_mCities.addAll(list_y);
all_mCities.addAll(list_z);
//---------------------------------------------------------------------------------------
this.mAdapter = new CityAdapter(this, this.all_mCities);
this.listView.setAdapter(this.mAdapter);
this.letterSideBar.setOverLayTextView(this.textView);
this.letterSideBar.setOnTouchLetterListener(this);
//城市列表点击事件监听
this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CityBean bean = (CityBean)mAdapter.getItem(position);
tv.setText(bean.getName());
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 101&& resultCode ==102){
String city = data.getStringExtra("city");
tv.setText(city);
}
}
/**
* 这个方法是用来与listview城市列表通信的,侧边栏的字母与城市列表字母一一对应
* @param letter
*/
public void onLetterSelected(String letter) {
int position = this.mAdapter.getPosition(letter);
if (position != -1) {
Log.v("LOG我在这里啊", "走到这里 position != -1 "+position);
this.listView.setSelection(position);
}
}
}