先看效果图
1 汉字排序
/**
* 汉字排序
*/
public class LanguageComparator_CN implements Comparator<String> {
public int compare(String ostr1, String ostr2) {
for (int i = 0; i < ostr1.length() && i < ostr2.length(); i++) {
int codePoint1 = ostr1.charAt(i);
int codePoint2 = ostr2.charAt(i);
if (Character.isSupplementaryCodePoint(codePoint1)
|| Character.isSupplementaryCodePoint(codePoint2)) {
i++;
}
if (codePoint1 != codePoint2) {
if (Character.isSupplementaryCodePoint(codePoint1)
|| Character.isSupplementaryCodePoint(codePoint2)) {
return codePoint1 - codePoint2;
}
String pinyin1 = pinyin((char) codePoint1);
String pinyin2 = pinyin((char) codePoint2);
if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字
if (!pinyin1.equals(pinyin2)) {
return pinyin1.compareTo(pinyin2);
}
} else {
return codePoint1 - codePoint2;
}
}
}
return ostr1.length() - ostr2.length();
}
// 获得汉字拼音的首字符
private String pinyin(char c) {
String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
if (pinyins == null) {
return null;
}
return pinyins[0];
}
}
2 侧边A-Z字母控件,带拉划事件在界面中心显示接口
/**
* Created by lenovo on 2015/10/27.
*/
public class AssortView extends Button {
public interface OnTouchAssortListener {
public void onTouchAssortListener(String s);
public void onTouchAssortUP();
}
public AssortView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public AssortView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public AssortView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
// 分类
private String[] assort = { "?", "#", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z" };
private Paint paint = new Paint();
// 选择的索引
private int selectIndex = -1;
// 字母监听器
private OnTouchAssortListener onTouch;
public void setOnTouchAssortListener(OnTouchAssortListener onTouch) {
this.onTouch = onTouch;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
int height = getHeight();
int width = getWidth();
int interval = height / assort.length;
for (int i = 0, length = assort.length; i < length; i++) {
// 抗锯齿
paint.setAntiAlias(true);
// 默认粗体
paint.setTypeface(Typeface.DEFAULT_BOLD);
// 白色
paint.setColor(Color.WHITE);
paint.setTextSize(30);
if (i == selectIndex) {
// 被选择的字母改变颜色和粗体
paint.setColor(Color.parseColor("#3399ff"));
paint.setFakeBoldText(true);
paint.setTextSize(40);
}
// 计算字母的X坐标
float xPos = width / 2 - paint.measureText(assort[i]) / 2;
// 计算字母的Y坐标
float yPos = interval * i + interval;
canvas.drawText(assort[i], xPos, yPos, paint);
paint.reset();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float y = event.getY();
int index = (int) (y / getHeight() * assort.length);
if (index >= 0 && index < assort.length) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
// 如果滑动改变
if (selectIndex != index) {
selectIndex = index;
if (onTouch != null) {
onTouch.onTouchAssortListener(assort[selectIndex]);
}
}
break;
case MotionEvent.ACTION_DOWN:
selectIndex = index;
if (onTouch != null) {
onTouch.onTouchAssortListener(assort[selectIndex]);
}
break;
case MotionEvent.ACTION_UP:
if (onTouch != null) {
onTouch.onTouchAssortUP();
}
selectIndex = -1;
break;
}
} else {
selectIndex = -1;
if (onTouch != null) {
onTouch.onTouchAssortUP();
}
}
invalidate();
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
3布局xml文件
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ExpandableListView
android:id="@+id/elist"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:groupIndicator="@null" />
<com.scdl.zny.view.AssortView
android:id="@+id/assort"
android:layout_width="30dip"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
4 adapter适配器
/**
* Created by lenovo on 2015/10/27.
*/
public class PinyinAdapter extends BaseExpandableListAdapter {
// 字符串
private List<String> strList;
private AssortPinyinList assort = new AssortPinyinList();
private UserKeyByString userKey= new UserKeyByString();
private List<Users>list;
private Context context;
private LayoutInflater inflater;
// 中文排序
private LanguageComparator_CN cnSort = new LanguageComparator_CN();
public PinyinAdapter(Context context, List<Users> list) {
super();
this.context = context;
this.inflater = LayoutInflater.from(context);
this.list = list;
if (list == null) {
list = new ArrayList<Users>();
}
// 排序
sort();
}
private void sort() {
// 分类
for (Users u : list) {
userKey.add(u);
assort.getHashList().add(u.getName());
}
assort.getHashList().sortKeyComparator(cnSort);
for (int i = 0, length = assort.getHashList().size(); i < length; i++) {
Collections.sort((assort.getHashList().getValueListIndex(i)), cnSort);
}
}
public Object getChild(int group, int child) {
// TODO Auto-generated method stub
return assort.getHashList().getValueIndex(group, child);
}
public long getChildId(int group, int child) {
// TODO Auto-generated method stub
return child;
}
public View getChildView(int group, int child, boolean arg2,
View contentView, ViewGroup arg4) {
// TODO Auto-generated method stub
if (contentView == null) {
contentView = inflater.inflate(R.layout.adapter_chat, null);
}
TextView name = (TextView) contentView.findViewById(R.id.name);
TextView phone = (TextView) contentView.findViewById(R.id.phone);
TextView adress = (TextView) contentView.findViewById(R.id.adress);
String s = assort.getHashList().getValueIndex(group, child);
Users u=userKey.getHashList().get(s);
name.setText(u.getName());
phone.setText(u.getPhone());
adress.setText(u.getDanw());
return contentView;
}
public int getChildrenCount(int group) {
// TODO Auto-generated method stub
return assort.getHashList().getValueListIndex(group).size();
}
public Object getGroup(int group) {
// TODO Auto-generated method stub
return assort.getHashList().getValueListIndex(group);
}
public int getGroupCount() {
// TODO Auto-generated method stub
return assort.getHashList().size();
}
public long getGroupId(int group) {
// TODO Auto-generated method stub
return group;
}
public View getGroupView(int group, boolean arg1, View contentView,
ViewGroup arg3) {
if (contentView == null) {
contentView = inflater.inflate(R.layout.list_group_item, null);
contentView.setClickable(true);
}
TextView textView = (TextView) contentView.findViewById(R.id.name);
String s = assort.getFirstChar(assort.getHashList().getValueIndex(group, 0));
textView.setText(s);
// 禁止伸展
return contentView;
}
public boolean hasStableIds() {
// TODO Auto-generated method stub
return true;
}
public boolean isChildSelectable(int arg0, int arg1) {
// TODO Auto-generated method stub
return true;
}
public AssortPinyinList getAssort() {
return assort;
}
}
在这里使用到了一个泛型辅助类
/** * Created by lenovo on 2015/10/26. * 键值对索引排序的工具类 HashMap简单排序的一种实现 * * @param <K> * @param <V> */ public class HashList<K, V> { /** * 键值集合 */ private List<K> keyArr = new ArrayList<K>(); /** * 键值对映射 */ private HashMap<K, List<V>> map = new HashMap<K, List<V>>(); /** * 键值分类 */ private KeySort<K, V> keySort; public HashList(KeySort<K, V> keySort) { // TODO Auto-generated constructor stub this.keySort = keySort; } /** * 根据value值返回key */ public K getKey(V v) { return keySort.getKey(v); } /** * 键值对排序 * * @param comparator */ public void sortKeyComparator(LanguageComparator_CN comparator) { Collections.sort(keyArr, (Comparator<? super K>) comparator); } /** * 根据索引返回键值 */ public K getKeyIndex(int key) { return keyArr.get(key); } /** * 根据索引返回键值对 */ public List<V> getValueListIndex(int key) { return map.get(getKeyIndex(key)); } public V getValueIndex(int key, int value) { return getValueListIndex(key).get(value); } public int size() { return keyArr.size(); } public void clear() { for (Iterator<K> it = map.keySet().iterator(); it.hasNext(); map.remove(it.next())) ; } public boolean contains(Object object) { // TODO Auto-generated method stub return false; } public boolean isEmpty() { // TODO Auto-generated method stub return false; } public Object remove(int location) { // TODO Auto-generated method stub return null; } public boolean remove(Object object) { // TODO Auto-generated method stub return false; } public boolean removeAll(Collection arg0) { // TODO Auto-generated method stub return false; } public boolean retainAll(Collection arg0) { // TODO Auto-generated method stub return false; } public Object set(int location, Object object) { // TODO Auto-generated method stub return keyArr.set(location, (K) object); } public List subList(int start, int end) { // TODO Auto-generated method stub return keyArr.subList(start, end); } public Object[] toArray() { // TODO Auto-generated method stub return keyArr.toArray(); } public Object[] toArray(Object[] array) { return keyArr.toArray(array); } public boolean add(Object object) { V v = (V) object; K key = getKey(v); if (!map.containsKey(key)) { List<V> list = new ArrayList<V>(); list.add(v); keyArr.add(key); map.put(key, list); } else { map.get(key).add(v); } return false; } public int indexOfKey(K k) { return keyArr.indexOf(k); } }
/** * Created by lenovo on 2015/10/27. */ public class UserKeyByString { private HashMap<String, Users> hashList = new HashMap<>(); public HashMap<String, Users> getHashList() { return hashList; } public void add(Users u) { hashList.put(u.getName(), u); } }