1 packagecom.lixu.letterlistview.letter;2
3 importjava.lang.ref.SoftReference;4 importjava.util.ArrayList;5 importjava.util.List;6
7 importcom.lixu.lianxirenlist.R;8 importandroid.content.Context;9 importandroid.os.Handler;10 importandroid.os.Message;11 importandroid.util.AttributeSet;12 importandroid.view.Gravity;13 importandroid.view.LayoutInflater;14 importandroid.view.MotionEvent;15 importandroid.view.View;16 importandroid.view.ViewGroup;17 importandroid.widget.AbsListView;18 importandroid.widget.BaseAdapter;19 importandroid.widget.FrameLayout;20 importandroid.widget.ListView;21 importandroid.widget.TextView;22 importandroid.widget.AdapterView.OnItemClickListener;23
24 /**
25 * 带有字母列表的listView26 *27 * @Title:28 * @Description:29 * @Author:Justlcw30 * @Since:2014-5-731 * @Version:32 */
33 public class LetterListView extendsFrameLayout {34 /**隐藏字母消息 **/
35 private final int MSG_HIDE_LETTER = 0x0;36
37 /**字母列表的宽度 **/
38 private final int LETTER_LIST_VIEW_WIDTH = 50;//TODO 这里宽度写死了,按着一定的比例比较好
39
40 /**内容列表 **/
41 privateListView mListView;42 /**内容列表适配器 **/
43 privateLetterBaseAdapter mAdapter;44
45 /**字母列表 **/
46 privateListView mLetterListView;47 privateLetterAdapter mLetterAdapter;48
49 privateTextView mLetterTextView;50
51 /**字母消息Handler **/
52 privateHandler mLetterhandler;53
54 /**
55 * 构造方法56 *57 *@paramcontext58 */
59 publicLetterListView(Context context) {60 super(context);61 initListView(context);62 }63
64 /**
65 * 构造方法66 *67 *@paramcontext68 *@paramattrs69 */
70 publicLetterListView(Context context, AttributeSet attrs) {71 super(context, attrs);72 initListView(context);73 }74
75 /**
76 * 初始化 内容列表 字母列表77 *78 * @Description:79 * @Author Justlcw80 * @Date 2014-5-781 */
82 private voidinitListView(Context context) {83 LayoutInflater inflater =LayoutInflater.from(getContext());84 //TODO 这里添加内容列表,可以在这里对ListView进行一些你想要的设置
85 mListView = (ListView) inflater.inflate(R.layout.letter_list_container, null, false);86 LayoutParams lp = newLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);87 addView(mListView, lp);88
89 //TODO 这里添加字母列表,可以在这里对ListView进行一些你想要的设置
90 mLetterListView = (ListView) inflater.inflate(R.layout.letter_list_letter, null, false);91 mLetterListView.setOnTouchListener(mLetterOnTouchListener);92 LayoutParams letterListLp = newLayoutParams(LETTER_LIST_VIEW_WIDTH, LayoutParams.MATCH_PARENT, Gravity.RIGHT);93 addView(mLetterListView, letterListLp);94
95 //TODO 这里对显示的字母进行设置
96 mLetterTextView = (TextView) inflater.inflate(R.layout.letter_list_position, null, false);97 LayoutParams letterLp = newLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER);98 addView(mLetterTextView, letterLp);99 mLetterTextView.setVisibility(View.INVISIBLE);100
101 //初始化letter消息发送者
102 mLetterhandler = new LetterHandler(this);103 }104
105 /**
106 * 设置内容列表适配器107 *108 *@paramadapter109 * {@linkLetterBaseAdapter}110 * @Description:111 * @Author Justlcw112 * @Date 2014-5-7113 */
114 public voidsetAdapter(LetterBaseAdapter adapter) {115 if (adapter != null) {116 mAdapter =adapter;117 mListView.setAdapter(mAdapter);118 }119 }120
121 /**
122 * {@linkAbsListView#setOnItemClickListener(OnItemClickListener)}123 *124 * @Description:125 * @Author Justlcw126 * @Date 2014-5-14127 */
128 public voidsetOnItemClickListener(OnItemClickListener onItemClickListener) {129 mListView.setOnItemClickListener(onItemClickListener);130 }131
132 @Override133 protected void onSizeChanged(int w, int h, int oldw, intoldh) {134 super.onSizeChanged(w, h, oldw, oldh);135
136 mLetterAdapter = new LetterAdapter(h - getPaddingTop() -getPaddingBottom());137 mLetterListView.setAdapter(mLetterAdapter);138 }139
140 /**
141 * 显示字母142 *143 * @Description:144 * @Author Justlcw145 * @Date 2014-5-8146 */
147 private voidshowLetter(String letter) {148 if (mLetterTextView.getVisibility() !=View.VISIBLE) {149 mLetterTextView.setVisibility(View.VISIBLE);150 mLetterListView.setBackgroundResource(android.R.color.darker_gray);151 }152 mLetterTextView.setText(letter);153
154 mLetterhandler.removeMessages(MSG_HIDE_LETTER);155 mLetterhandler.sendEmptyMessageDelayed(MSG_HIDE_LETTER, 500);156 }157
158 /**
159 * 处理消息 {@linkLetterHandler#handleMessage(Message)}160 *161 *@parammsg162 * 消息163 * @Description:164 * @Author Justlcw165 * @Date 2014-5-8166 */
167 private voidhandleLetterMessage(Message msg) {168 mLetterTextView.setVisibility(View.INVISIBLE);169 mLetterListView.setBackgroundResource(android.R.color.white);170 }171
172 /**字母栏touch事件 **/
173 private View.OnTouchListener mLetterOnTouchListener = newView.OnTouchListener() {174 @Override175 public booleanonTouch(View v, MotionEvent event) {176 int height = (int) event.getY() -v.getTop();177
178 int position =mLetterAdapter.getTouchPoistion(height);179 if (position >= 0) {180 char letter =(Character) mLetterAdapter.getItem(position);181 //显示字母
182 showLetter(String.valueOf(letter));183
184 //显示到字母对应的位置
185 int select =mAdapter.getIndex(letter);186 if (select >= 0) {187 mListView.setSelection(select);188 }189 return true;190 }191 return false;192 }193 };194
195 /**
196 * 字母列表设配器197 *198 * @Title:199 * @Description:200 * @Author:Justlcw201 * @Since:2014-5-7202 * @Version:203 */
204 private class LetterAdapter extendsBaseAdapter {205 /**字母表 **/
206 private static final String LETTER_STR = "+ABCDEFGHIJKLMNOPQRSTUVWXYZ#";207 /**最终显示的字母array **/
208 private char[] letterArray;209 /**每个字母的高度 **/
210 private intitemHeight;211
212 /**
213 * 构造方法214 *215 *@paramheight216 * view height217 */
218 public LetterAdapter(intheight) {219 if(mAdapter.hideLetterNotMatch()) {220 List list = new ArrayList();221 char[] allArray =LETTER_STR.toCharArray();222 for (int i = 0; i < allArray.length; i++) {223 char letter =allArray[i];224 int position =mAdapter.getIndex(letter);225 if (position >= 0) {226 list.add(letter);227 }228 }229 letterArray = new char[list.size()];230 for (int i = 0; i < list.size(); i++) {231 letterArray[i] =list.get(i);232 }233 list.clear();234 list = null;235 } else{236 letterArray =LETTER_STR.toCharArray();237 }238 itemHeight = height /letterArray.length;239 }240
241 @Override242 public intgetCount() {243 returnletterArray.length;244 }245
246 @Override247 public Object getItem(intposition) {248 returnletterArray[position];249 }250
251 @Override252 public long getItemId(intposition) {253 returnposition;254 }255
256 @Override257 public View getView(intposition, View convertView, ViewGroup parent) {258 if (convertView == null) {259 convertView = newTextView(getContext());260 ((TextView) convertView).setTextColor(getResources().getColor(android.R.color.black));261 ((TextView) convertView).setGravity(Gravity.CENTER);262 AbsListView.LayoutParams lp = newAbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,263 itemHeight);264 convertView.setLayoutParams(lp);265 }266 ((TextView) convertView).setText(String.valueOf(letterArray[position]));267
268 returnconvertView;269 }270
271 /**
272 * 获取touch的位置273 *274 *@returnposition275 * @Description:276 * @Author Justlcw277 * @Date 2014-5-8278 */
279 public int getTouchPoistion(inttouchHeight) {280 int position = touchHeight /itemHeight;281 if (position >= 0 && position
288 /**
289 * 处理字母显示的handler.290 *291 * @Title:292 * @Description:293 * @Author:Justlcw294 * @Since:2014-5-8295 * @Version:296 */
297 private static class LetterHandler extendsHandler {298 /**弱引用 {@linkLetterListView} **/
299 private SoftReferencesrLetterListView;300
301 /**
302 * 构造方法303 *304 *@paramletterListView305 * {@linkLetterListView}306 */
307 publicLetterHandler(LetterListView letterListView) {308 srLetterListView = new SoftReference(letterListView);309 }310
311 @Override312 public voidhandleMessage(Message msg) {313 LetterListView letterListView =srLetterListView.get();314 //如果view没有被销毁掉,交给view处理这个消息
315 if (letterListView != null) {316 letterListView.handleLetterMessage(msg);317 }318 }319 }320 }