上面有A- Z的实现
1.定义一个方法:返回首字母是大写的方法,里面得到一个字符串的拼音的大写
getPinyin
(str).toUpperCase()
,在取拼音字符串的第一个字母
charAt(
0
);
,判断如果不是A-Z字母(65-90是A-Z字母),就返回#,如果是就返回A-Z。
2.定义一个HashMap,key为字母,value 为下标。定义一个索引的方法,遍历数据,得到首字母,如果索引map中不包含这个字母,就添加进索引map,key是字母,value是第一次出现的位置。在adapter中拿到当前条目,然后取当前条目的首字母,如果和当前的索引一样,就让他显示,否则隐藏。
代码:
MainActivity: import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ListView; import java.util.Collections; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView mListview; private AddressAdapter adapter; private List<Address> addressList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListview = (ListView) findViewById(R.id.mListView); addressList = Address.getAddress(); Collections.sort(addressList,new Sort.AddressCompartor()); adapter = new AddressAdapter(this, addressList);
adapter.setIndex(); mListview.setAdapter(adapter); } }
address: import java.util.ArrayList; import java.util.List; public class Address { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static List<Address> getAddress() { List<String> list = getAllMember(); List<Address> addresses = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { Address address = new Address(); address.setId(i); address.setName(list.get(i)); addresses.add(address); } return addresses; } public static List<String> getAllMember() { List<String> addresses = new ArrayList<>(); addresses.add("bdvs"); addresses.add("马你不"); addresses.add("王九"); addresses.add("李广"); addresses.add("李飞"); addresses.add("张伟"); addresses.add("马田"); addresses.add("商具体"); addresses.add("韩可以"); addresses.add("张交易"); addresses.add("韩吗"); addresses.add("张近一"); addresses.add("李进度"); addresses.add("1512薛美女"); addresses.add("杨今天"); addresses.add("行核对"); addresses.add("郭按时"); addresses.add("郭方式"); addresses.add("李百度"); addresses.add("王过的"); addresses.add("段更多"); addresses.add("李和他"); addresses.add("张舒服"); addresses.add("刘方式"); addresses.add("靳广东人"); addresses.add("徐是"); addresses.add("李黄飞"); addresses.add("崔广办"); addresses.add("宋答复"); addresses.add("廉干部"); addresses.add("张水电"); addresses.add("绳可以"); addresses.add("陈监狱"); addresses.add("黄回调"); addresses.add("李后台"); addresses.add("王菊花"); addresses.add("丛好热"); addresses.add("刘三个"); addresses.add("庞黄飞"); addresses.add("杨嗨翻天"); addresses.add("尹听过"); return addresses; } }
PinyinUtils: 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; public class PinyinUtils {/** * 返回首字母,大写 */ public static String getFirstLetter(String str) { if (TextUtils.isEmpty(str)) { return ""; } // 得到一个字符串的拼音的大写 String pinyinStr = getPinyin(str).toUpperCase(); // 取拼音字符串的第一个字母 char firstCahr = pinyinStr.charAt(0); // 不是A-Z字母 if (firstCahr > 90 || firstCahr < 65) { return "#"; }else{ // 代表是A-Z return String.valueOf(firstCahr); } } /** * 得到一个字符串的拼音读音 */ public static String getPinyin(String chineseStr) { StringBuffer sb = new StringBuffer(); // 将汉字拆分成一个个的char char[] chars = chineseStr.toCharArray(); // 遍历汉字的每一个char for (int i = 0; i < chars.length; i++) { try { // 汉字的所有读音放在一个pinyins数组 String[] strings = PinyinHelper.toHanyuPinyinStringArray(chars[i], getDefaultFormat()); if (strings == null) { sb.append(chars[i]); } else { sb.append(strings[0]); } } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) { badHanyuPinyinOutputFormatCombination.printStackTrace(); } } return sb.toString(); } /** * 设置默认的输出格式 */ public static HanyuPinyinOutputFormat getDefaultFormat() { HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat(); //去除声调 outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); //小写 outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 包含Unicode特殊字符 outputFormat.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE); return outputFormat; } }Sort: import java.util.Comparator; public class Sort { public static class AddressCompartor implements Comparator<Address>{ @Override public int compare(Address o1, Address o2) { String o1f = PinyinUtils.getFirstLetter(o1.getName()); String o2f = PinyinUtils.getFirstLetter(o2.getName()); if (o1f.equals("#")) { return 1; } else if (o2f.equals("#")) { return -1; } else { return o1f.compareTo(o2f); } } } }AddressAdapter: import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.List; public class AddressAdapter extends BaseAdapter { private Context context; private List<Address> list;private Map<String, Integer> indexMap = new HashMap<>(); public AddressAdapter(Context context, List<Address> list) { this.context = context; this.list = list; }public void setIndex() { indexMap.clear(); for (int i = 0; i < list.size(); i++) { // 遍历数据,得到首字母 String index = PinyinUtils.getFirstLetter(list.get(i).getName()); // 如果索引map中不包含这个字母,就添加进索引map,key是字母,value是第一次出现的位置 if (!indexMap.containsKey(index)) { indexMap.put(index, i); } } } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView=View.inflate(context, R.layout.activity_address,null);holder.title= (TextView) convertView.findViewById(R.id.text_title); holder.mTextName = (TextView) convertView.findViewById(R.id.mTextName); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); }// 拿到当前条目 String str = addressList.get(position).getName(); // 取当前条目的首字母 String first = PinyinUtils.getFirstLetter(str); if (indexMap.get(first) == position) { holder.title.setVisibility(View.VISIBLE); holder.title.setText(first); } else { holder.title.setVisibility(View.GONE); } holder.mTextName.setText(list.get(position).getName()); return convertView; } class ViewHolder {TextView title; TextView mTextName; } }activity_address:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><TextView android:id="@+id/text_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#666666" android:paddingBottom="3dp" android:paddingTop="3dp" android:textColor="#FFFFFF" android:visibility="gone" /> <TextView android:id="@+id/mTextName" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>