python实现字母索引通讯录_联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。...

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值