activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
<com.atguigu.quickindex.QuickIndexBar
android:id="@+id/qucikIndexBar"
android:layout_width="35dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:background="#CFCFCF" />
<TextView
android:id="@+id/currentIndex"
android:layout_width="120dp"
android:layout_height="105dp"
android:layout_centerInParent="true"
android:background="@drawable/bg_index"
android:gravity="center"
android:text="A"
android:textColor="#ffffff"
android:textSize="30sp"
android:visibility="gone" />
</RelativeLayout>
item_friend.xml
<?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="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/index"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:text="A"
android:textColor="#ffffff"
android:background="#666666"
android:textSize="18sp"/>
<TextView
android:id="@+id/name"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="10dp"
android:text="adasd"
android:textColor="#666666"
android:textSize="20sp"/>
</LinearLayout>
MainActivity
package com.atguigu.quickindex;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.atguigu.quickindex.QuickIndexBar.OnTouchIndexChange;
public class MainActivity extends Activity {
private ListView listView;
private QuickIndexBar qucikIndexBar;
private TextView currentIndex;
// 数据集合
private List<Friend> friends = new ArrayList<Friend>();
// 适配器
private FriendAdapter adapter;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 加载主布局
setContentView(R.layout.activity_main);
// 初始化控件
init();
}
private void init() {
/** 初始化布局视图 */
listView = (ListView) findViewById(R.id.listview);
qucikIndexBar = (QuickIndexBar) findViewById(R.id.qucikIndexBar);
currentIndex = (TextView) findViewById(R.id.currentIndex);
/** 初始化数据 */
initData();
// 创建适配器
adapter = new FriendAdapter();
// 设置适配器
listView.setAdapter(adapter);
// 设置触摸的字母变化的监听
qucikIndexBar.setOnTouchIndexChange(new OnTouchIndexChange() {
@Override
public void onChange(String word) {// word为当前触摸的字母
// 显示当前触摸的字母
showInexWord(word);
// 使用列表定位到对应的列表项
locationWord(word);
}
});
}
private void locationWord(String word) {
for (int i = 0; i < friends.size(); i++) {
//名字首字母
String firstWord = friends.get(i).getPinyin().charAt(0) + "";
if (firstWord.equals(word)) {
//定位到item的位置
listView.setSelection(i);
return;
}
}
}
private void showInexWord(String word) {
currentIndex.setVisibility(View.VISIBLE);
currentIndex.setText(word);
//停掉所用handler的消息,防止内存泄露
handler.removeCallbacksAndMessages(null);
//2秒的定时器
handler.postDelayed(new Runnable() {
@Override
public void run() {
currentIndex.setVisibility(View.GONE);
}
}, 2000);
}
private void initData() {
// 虚拟数据
friends.add(new Friend("张晓飞"));
friends.add(new Friend("杨光福"));
friends.add(new Friend("胡继群"));
friends.add(new Friend("刘畅"));
friends.add(new Friend("钟泽兴"));
friends.add(new Friend("尹革新"));
friends.add(new Friend("安传鑫"));
friends.add(new Friend("张骞壬"));
friends.add(new Friend("温松"));
friends.add(new Friend("李凤秋"));
friends.add(new Friend("刘甫"));
friends.add(new Friend("娄全超"));
friends.add(new Friend("张猛"));
friends.add(new Friend("王英杰"));
friends.add(new Friend("李振南"));
friends.add(new Friend("孙仁政"));
friends.add(new Friend("唐春雷"));
friends.add(new Friend("牛鹏伟"));
friends.add(new Friend("姜宇航"));
friends.add(new Friend("刘挺"));
friends.add(new Friend("张洪瑞"));
friends.add(new Friend("张建忠"));
friends.add(new Friend("侯亚帅"));
friends.add(new Friend("刘帅"));
friends.add(new Friend("乔竞飞"));
friends.add(new Friend("徐雨健"));
friends.add(new Friend("吴亮"));
friends.add(new Friend("王兆霖"));
friends.add(new Friend("阿三"));
friends.add(new Friend("二毛"));
/**
* Comparable。可以让自定义对象实现一个Comparable接口,这个接口只有一个方法comparableTo(Object o)
*
* 其规则是当前对象与o对象进行比较,返回一个int值,系统根据此值进行排序。
*
* 如当前对象>o对象,则返回值>0;
*
* 如当前对象=o对象,则返回值=0;
*
* 如当前对象<o对象,则返回值<0;
*/
Collections.sort(friends);
}
/**
* adapter
*/
class FriendAdapter extends BaseAdapter {
@Override
public int getCount() {
return friends.size();
}
@Override
public Object getItem(int position) {
return friends.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),
R.layout.item_friend, null);
holder = new ViewHolder();
holder.index = (TextView) convertView.findViewById(R.id.index);
holder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Friend friend = friends.get(position);
String firstWord = friend.getPinyin().charAt(0) + "";// 得到拼音首字母
if (position == 0) {// 如果是第一个, 显示首字母View
holder.index.setVisibility(View.VISIBLE);
} else {// 如果不是第一个
// 上一项的拼音首字母
String preFirstWord = friends.get(position - 1).getPinyin()
.charAt(0)
+ "";
if (firstWord.equals(preFirstWord)) {// 如果当前的与上一个相同, 不显示首字母View
holder.index.setVisibility(View.GONE);
} else {// 否则, 显示
holder.index.setVisibility(View.VISIBLE);
}
}
holder.index.setText(firstWord);
holder.name.setText(friend.getName());
return convertView;
}
class ViewHolder {
TextView index, name;
}
}
}
QuickIndexBar
package com.atguigu.quickindex;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* 自定义快速索引的View
*/
public class QuickIndexBar extends View {
public QuickIndexBar(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化paint
paint = new Paint();
paint.setAntiAlias(true);// 抗据齿
}
private Paint paint;
// 字母的宽、高
private int cellWidth;
private int cellHeight;
private int touchIndex = -1;
// 字体选中、非选中大小
private int textSize;
private int textTouchSize;
private String[] indexArr = { "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" };
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
cellWidth = this.getMeasuredWidth();
cellHeight = this.getMeasuredHeight() / indexArr.length;
textSize = cellHeight - 5;
textTouchSize = cellHeight + 5;
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < indexArr.length; i++) {
// 字母的字体大小
paint.setTextSize(i == touchIndex ? textTouchSize : textSize);
// 字母的字体颜色
paint.setColor(i == touchIndex ? Color.parseColor("#666666")
: Color.WHITE);
// 计算字母显示的宽高
Rect bounds = new Rect();
//paint.getTextBounds(str, 0, str.length(), rect);
paint.getTextBounds(indexArr[i], 0, 1, bounds);
int width = bounds.width();
int height = bounds.height();
// 计算字母绘制的坐标
float x = cellWidth / 2 - width / 2;
float y = i * cellHeight + cellHeight / 2 + height / 2;
// 绘制字母文本
canvas.drawText(indexArr[i], x, y, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 相对于当前View的事件y坐标
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
// 如果没有在当前字母的区域内, 就需要更新touchIndex, 并重绘
int index = y / cellHeight;
if (index != touchIndex) {
touchIndex = index;
if (touchIndex >= indexArr.length)
touchIndex = indexArr.length - 1;
// 强制重绘
invalidate();
// 如果有监听器, 调用监听器的回调方法
if (onTouchIndexChange != null) {
onTouchIndexChange.onChange(indexArr[touchIndex]);
}
}
break;
case MotionEvent.ACTION_UP:
touchIndex = -1;
// 强制重绘
invalidate();
break;
default:
break;
}
return true;
}
private OnTouchIndexChange onTouchIndexChange;
public void setOnTouchIndexChange(OnTouchIndexChange onTouchIndexChange) {
this.onTouchIndexChange = onTouchIndexChange;
}
public interface OnTouchIndexChange {
public void onChange(String word);
}
}
Friend
package com.atguigu.quickindex;
/**
* 好友信息对象
*/
public class Friend implements Comparable<Friend> {
private String name;//姓名
private String pinyin;//姓名对应的拼音
public Friend(String name) {
super();
this.name = name;
//通过名字得到对应的拼音
this.pinyin = PinYinUtils.getPinYin(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
@Override
public String toString() {
return "Friend [name=" + name + ", pinyin=" + pinyin + "]";
}
/**
* 此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。
*/
@Override
public int compareTo(Friend another) {
return pinyin.compareTo(another.getPinyin());
}
}
PinYinUtils
package com.atguigu.quickindex;
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.exception.BadHanyuPinyinOutputFormatCombination;
/**
* 将汉字转换为拼音
*/
public class PinYinUtils {
/**
* 得到指定汉字的拼音
* 注意:不应该被频繁调用,它消耗一定内存
*/
public static String getPinYin(String hanzi){
String pinyin = "";
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();//控制转换是否大小写,是否带音标
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);//大写
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
//由于不能直接对多个汉字转换,只能对单个汉字转换
char[] arr = hanzi.toCharArray();
for (int i = 0; i < arr.length; i++) {
if(Character.isWhitespace(arr[i]))continue;//如果是空格,则不处理,进行下次遍历
//汉字是2个字节存储,肯定大于127,所以大于127就可以当为汉字转换
if(arr[i]>127){
try {
//由于多音字的存在,单 dan shan
String[] pinyinArr = PinyinHelper.toHanyuPinyinStringArray(arr[i], format);
if(pinyinArr!=null){
pinyin += pinyinArr[0];
}else {
pinyin += arr[i];
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
//不是正确的汉字
pinyin += arr[i];
}
}else {
//不是汉字,
pinyin += arr[i];
}
}
return pinyin;
}
}
************************************************方法二***************************************************************
activity_main.xml
<FrameLayout 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" >
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@null"
android:fastScrollEnabled="true" />
<com.example.listsildedel.SideBar
android:id="@+id/sideBar"
android:layout_width="25dp"
android:layout_height="fill_parent"
android:layout_gravity="right|center_vertical" />
</FrameLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="vertical" >
<TextView
android:id="@+id/catalog"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/mm_contact_title"
android:paddingRight="4.0dip"
android:shadowColor="#000000"
android:shadowDx="1.0"
android:shadowDy="1.0"
android:shadowRadius="1.0"
android:paddingLeft="5dip"
android:gravity="center_vertical"
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/mm_listitem_simple"
android:gravity="center_vertical"
android:orientation="horizontal" >
<ImageView
android:id="@+id/img"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_marginLeft="5dip"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:src="@drawable/personactivity_takephoto_icon_normal" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="8dip"
android:gravity="center_vertical"
android:paddingBottom="8dip"
android:paddingTop="8dip"
android:singleLine="true"
android:text="hhhh" />
</LinearLayout>
</LinearLayout>
list_position.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_gravity="center"
android:background="@drawable/show_head_toast_bg"
android:gravity="center"
android:maxHeight="70dip"
android:maxWidth="70dip"
android:minHeight="70dip"
android:minWidth="70dip"
android:textColor="@android:color/white"
android:textSize="50sp" />
MainActivity
package com.example.listsildedel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ListView mListView;
private SideBar indexBar;
private WindowManager mWindowManager;
private TextView mDialogText;
// private View head;
@Override
public void onCreate(Bundle savedInstanceState) {
// 启动activity时不自动弹出软键盘
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
super.onCreate(savedInstanceState);
// 加载布局listView+自定义com.example.listsildedel.SideBar
setContentView(R.layout.activity_main);
// 得到listView视图
mListView = (ListView) this.findViewById(R.id.list);
// 得到自定义控件视图
indexBar = (SideBar) findViewById(R.id.sideBar);
// 字母索引控件
mDialogText = (TextView) LayoutInflater.from(this).inflate(
R.layout.list_position, null);
// 初始化默认不可见
mDialogText.setVisibility(View.INVISIBLE);
// 获取WindowManager实例
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
/**
* 这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View
*/
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
// 添加字母索引控件
mWindowManager.addView(mDialogText, lp);
indexBar.setTextView(mDialogText);
// 初始化数据
List<Content> list = new ArrayList<Content>();
for (int i = 0; i < 10; i++) {
Content m;
if (i < 3)
m = new Content("A", "选项" + i);
else if (i < 6)
m = new Content("F", "选项" + i);
else
m = new Content("D", "选项" + i);
list.add(m);
}
// 根据a-z进行排序
Collections.sort(list, new PinyinComparator());
// 实例化自定义内容适配类
MyAdapter adapter = new MyAdapter(this, list);
// 为listView设置适配
mListView.setAdapter(adapter);
// 设置SideBar的ListView内容实现点击a-z中任意一个进行定位
indexBar.setListView(mListView);
}
}
MyAdapter
package com.example.listsildedel;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter implements SectionIndexer{
private List<Content> list = null;
private Context mContext;
public MyAdapter(Context mContext, List<Content> list) {
this.mContext = mContext;
this.list = list;
}
public int getCount() {
return this.list.size();
}
public Object getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup arg2) {
ViewHolder viewHolder = null;
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.item, null);
viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
viewHolder.catalog = (TextView) view.findViewById(R.id.catalog);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
final Content mContent = list.get(position);
if (position == 0) {
//将头部显示,并且获取首字母
viewHolder.catalog.setVisibility(View.VISIBLE);
viewHolder.catalog.setText(mContent.getLetter());
} else {
String lastCatalog = list.get(position - 1).getLetter();
if (mContent.getLetter().equals(lastCatalog)) {
viewHolder.catalog.setVisibility(View.GONE);
} else {
viewHolder.catalog.setVisibility(View.VISIBLE);
viewHolder.catalog.setText(mContent.getLetter());
}
}
viewHolder.tvTitle.setText(this.list.get(position).getName());
return view;
}
final static class ViewHolder {
TextView tvTitle;
TextView catalog;
}
public Object[] getSections() {
return null;
}
public int getSectionForPosition(int position) {
return 0;
}
//根据分类列的索引号获得该序列的首个位置
public int getPositionForSection(int section) {
Content mContent;
String l;
if (section == '!') {
return 0;
} else {
for (int i = 0; i < getCount(); i++) {
mContent = (Content) list.get(i);
l = mContent.getLetter();
char firstChar = l.toUpperCase().charAt(0);
if (firstChar == section) {
return i + 1;
}
}
}
mContent = null;
l = null;
return -1;
}
}
SideBar
package com.example.listsildedel;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HeaderViewListAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;
public class SideBar extends View {
// 字符数组
private char[] l;
private SectionIndexer sectionIndexter = null;
private TextView mDialogText;
private int type = 1;
private int color = 0xff858c94;
/**
***************************************************** 构造器
*/
public SideBar(Context context) {
super(context);
init();
}
public SideBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
// 设置画笔颜色
paint.setColor(color);
// 设置字体大小
paint.setTextSize(20);
paint.setStyle(Style.FILL);
paint.setTextAlign(Paint.Align.CENTER);
float widthCenter = getMeasuredWidth() / 2;
if (l.length > 0) {
float height = getMeasuredHeight() / l.length;
for (int i = 0; i < l.length; i++) {
canvas.drawText(String.valueOf(l[i]), widthCenter, (i + 1)
* height, paint);
}
}
this.invalidate();
super.onDraw(canvas);
}
private void init() {
l = new char[] { '!', '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 ListView list;
public void setListView(ListView _list) {
list = _list;
MyAdapter adapter = (MyAdapter) _list.getAdapter();
sectionIndexter = (SectionIndexer) adapter;
}
public void setTextView(TextView mDialogText) {
this.mDialogText = mDialogText;
}
/***********************************************************/
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
int i = (int) event.getY();
/* 字母条索引 */
int idx = i / (getMeasuredHeight() / l.length);
if (idx >= l.length) {
idx = l.length - 1;
} else if (idx < 0) {
idx = 0;
}
if (event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_MOVE) {
setBackgroundResource(R.drawable.scrollbar_bg);
// 字母条的背景
mDialogText.setVisibility(View.VISIBLE);
if (idx == 0) {
mDialogText.setText("Search");
mDialogText.setTextSize(16);
} else {
mDialogText.setText(String.valueOf(l[idx]));
mDialogText.setTextSize(34);
}
int position = sectionIndexter.getPositionForSection(l[idx]);
if (position == -1) {
return true;
}
list.setSelection(position);
} else {
mDialogText.setVisibility(View.INVISIBLE);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
setBackgroundDrawable(new ColorDrawable(0x00000000));
}
return true;
}
}
Content
package com.example.listsildedel;
public class Content {
private String letter;
private String name;
public Content(String letter, String name) {
super();
this.letter = letter;
this.name = name;
}
public String getLetter() {
return letter;
}
public void setLetter(String letter) {
this.letter = letter;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
PinyinComparator
package com.example.listsildedel;
import java.util.Comparator;
public class PinyinComparator implements Comparator<Content> {
public int compare(Content o1, Content o2) {
// if (o1.getLetter().equals("@")
// || o2.getLetter().equals("#")) {
// return -1;
// } else if (o1.getLetter().equals("#")
// || o2.getLetter().equals("@")) {
// return 1;
// } else {
// }
return o1.getLetter().compareTo(o2.getLetter());
}
}