Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 聯系人的側邊字母索引ListView 將手機通訊錄姓名通過首字母排序。,listview通訊錄

聯系人的側邊字母索引ListView 將手機通訊錄姓名通過首字母排序。,listview通訊錄

編輯:關於android開發

聯系人的側邊字母索引ListView 將手機通訊錄姓名通過首字母排序。,listview通訊錄


 

 

  1 package com.lixu.letterlistview;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import org.apache.http.NameValuePair;
  6 import org.apache.http.message.BasicNameValuePair;
  7 import com.lixu.letterlistview.letter.LetterBaseListAdapter;
  8 import com.lixu.letterlistview.letter.LetterListView;
  9 import com.lixu.lianxirenlist.R;
 10 import android.app.Activity;
 11 import android.content.ContentResolver;
 12 import android.database.Cursor;
 13 import android.graphics.Color;
 14 import android.net.Uri;
 15 import android.os.Bundle;
 16 import android.view.Gravity;
 17 import android.view.View;
 18 import android.view.ViewGroup;
 19 import android.widget.TextView;
 20 
 21 public class MainActivity extends Activity {
 22     private ArrayList<String> dataArray;
 23 
 24     @Override
 25     protected void onCreate(Bundle savedInstanceState) {
 26         super.onCreate(savedInstanceState);
 27         setContentView(R.layout.activity_main);
 28         // 通過獲取手機通訊錄的姓名
 29         dataArray = new ArrayList<String>();
 30 
 31         Uri uri = Uri.parse("content://com.android.contacts/contacts");
 32         ContentResolver resolver = this.getContentResolver();
 33         // 給query傳遞一個SORT_KEY_PRIMARY,讓ContentResolver將獲得的數據按照聯系人名字首字母排序
 34         Cursor cursor = resolver.query(uri, null, null, null,
 35                 android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);
 36         while (cursor.moveToNext())
 37 
 38         {
 39             // 聯系人的id
 40             String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));
 41             // 將聯系人按姓名首字母分組
 42             String sort_key_primary = cursor
 43                     .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));
 44             // 獲取聯系人的名字
 45             String name = cursor
 46                     .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));
 47             dataArray.add(name);
 48         }
 49 
 50         LetterListView letterListView = (LetterListView) findViewById(R.id.letterListView);
 51         letterListView.setAdapter(new TestAdapter());
 52 
 53     }
 54 
 55     /**
 56      * 這裡 使用一個簡單的 NameValuePair 對象,做為測試
 57      * 
 58      * @Title:
 59      * @Description:
 60      * @Author:Justlcw
 61      * @Since:2014-5-13
 62      * @Version:
 63      */
 64     class TestAdapter extends LetterBaseListAdapter<NameValuePair> {
 65         /** 字母對應的key,因為字母是要插入到列表中的,為了區別,所有字母的item都使用同一的key. **/
 66         private static final String LETTER_KEY = "letter";
 67 
 68         public TestAdapter() {
 69             super();
 70 
 71             List<NameValuePair> dataList = new ArrayList<NameValuePair>();
 72             for (int i = 0; i < dataArray.size(); i++) {
 73                 NameValuePair pair = new BasicNameValuePair(String.valueOf(i), dataArray.get(i));
 74                 dataList.add(pair);
 75             }
 76             setContainerList(dataList);
 77         }
 78 
 79         @Override
 80         public Object getItem(int position) {
 81             return list.get(position);
 82         }
 83 
 84         @Override
 85         public long getItemId(int position) {
 86             return position;
 87         }
 88 
 89         @Override
 90         public String getItemString(NameValuePair t) {
 91             return t.getValue();
 92         }
 93 
 94         @Override
 95         public NameValuePair create(char letter) {
 96             return new BasicNameValuePair(LETTER_KEY, String.valueOf(letter));
 97         }
 98 
 99         @Override
100         public boolean isLetter(NameValuePair t) {
101             // 判斷是不是字母行,通過key比較,這裡是NameValuePair對象,其他對象,就由你自己決定怎麼判斷了.
102             return t.getName().equals(LETTER_KEY);
103         }
104 
105         @Override
106         public View getLetterView(int position, View convertView, ViewGroup parent) {
107             // 這裡是字母的item界面設置.
108             if (convertView == null) {
109                 convertView = new TextView(MainActivity.this);
110                 ((TextView) convertView).setGravity(Gravity.CENTER_VERTICAL);
111                 convertView.setBackgroundColor(getResources().getColor(android.R.color.white));
112             }
113             ((TextView) convertView).setText(list.get(position).getValue());
114             ((TextView) convertView).setBackgroundColor(Color.GREEN);
115             ((TextView) convertView).setTextSize(25);
116             return convertView;
117         }
118 
119         @Override
120         public View getContainerView(int position, View convertView, ViewGroup parent) {
121             // 這裡是其他正常數據的item界面設置.
122             if (convertView == null) {
123                 convertView = new TextView(MainActivity.this);
124                 ((TextView) convertView).setGravity(Gravity.CENTER_VERTICAL);
125             }
126             ((TextView) convertView).setText(list.get(position).getValue());
127             ((TextView) convertView).setBackgroundColor(Color.YELLOW);
128             ((TextView) convertView).setTextSize(20);
129 
130             return convertView;
131         }
132     }
133 }

 

 1 package com.lixu.letterlistview.letter;
 2 
 3 import android.widget.BaseAdapter;
 4 
 5 /**
 6  * 帶有側邊字母列表的listView適配器
 7  * 
 8  *@Title:
 9  *@Description:
10  *@Author:Justlcw
11  *@Since:2014-5-8
12  *@Version:
13  */
14 public abstract class LetterBaseAdapter extends BaseAdapter
15 {
16     /** 字母表頭部 **/
17     protected static final char HEADER = '+';
18     /** 字母表尾部 **/
19     protected static final char FOOTER = '#';
20 
21     /**
22      * 是否需要隱藏沒有匹配到的字母
23      * 
24      * @return true 隱藏, false 不隱藏
25      * @Description:
26      * @Author Justlcw
27      * @Date 2014-5-8
28      */
29     public abstract boolean hideLetterNotMatch();
30     
31     /**
32      * 獲取字母對應的位置
33      * 
34      * @return position
35      * @Description:
36      * @Author Justlcw
37      * @Date 2014-5-8
38      */
39     public abstract int getIndex(char letter);
40 }
  1 package com.lixu.letterlistview.letter;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7 import android.text.TextUtils;
  8 import android.util.Log;
  9 import android.view.View;
 10 import android.view.ViewGroup;
 11 
 12 /**
 13  * 通用帶有字母列表的泛型對象adapter
 14  * 
 15  * @Title:
 16  * @Description:
 17  * @Author:Justlcw
 18  * @Since:2014-5-9
 19  * @Version:
 20  */
 21 public abstract class LetterBaseListAdapter<T> extends LetterBaseAdapter {
 22     /** log tag. **/
 23     private static final String TAG = "LetterBaseListAdapter";
 24 
 25     /** 默認錯誤頭部字母. **/
 26     private static final char ERROR_LETTER = ' ';
 27 
 28     /** view type的類型總數 **/
 29     private static final int TYPE_COUNT = 2;
 30     /** 字母類型 **/
 31     private static final int TYPE_LETTER = 0;
 32     /** 實體類型 **/
 33     private static final int TYPE_CONTAINER = 1;
 34 
 35     /** 添加字母之後的list **/
 36     protected final List<T> list;
 37     /** 字母頭位置標示map **/
 38     private final Map<Character, Integer> letterMap;
 39 
 40     /**
 41      * 構造方法
 42      */
 43     public LetterBaseListAdapter() {
 44         list = new ArrayList<T>();
 45         letterMap = new HashMap<Character, Integer>();
 46     }
 47 
 48     /**
 49      * 構造方法
 50      * 
 51      * @param dataArray
 52      *            內容數組
 53      */
 54     public LetterBaseListAdapter(T[] dataArray) {
 55         this();
 56         setContainerList(dataArray);
 57     }
 58 
 59     /**
 60      * 構造方法
 61      * 
 62      * @param dataList
 63      *            內容列表
 64      */
 65     public LetterBaseListAdapter(List<T> dataList) {
 66         this();
 67         setContainerList(dataList);
 68     }
 69 
 70     /**
 71      * 設置主體內容
 72      * 
 73      * @param dataArray
 74      *            實體數組
 75      * @Description:
 76      * @Author Justlcw
 77      * @Date 2014-5-9
 78      */
 79     protected final void setContainerList(T[] dataArray) {
 80         if (!list.isEmpty()) {
 81             list.clear();
 82         }
 83         if (!letterMap.isEmpty()) {
 84             letterMap.clear();
 85         }
 86 
 87         char letter = ERROR_LETTER;
 88         int index = 0;
 89         for (int i = 0; i < dataArray.length; i++) {
 90             T t = dataArray[i];
 91 
 92             char l = getHeaderLetter(t);
 93 
 94             if (letter != l && l != ERROR_LETTER) {
 95                 // 如果發現這個字母沒有添加過,更新一下標示
 96                 letter = l;
 97                 // 創建一個T類型的字母頭放進去
 98                 T tl = create(letter);
 99                 if (tl != null) {
100                     // 如果創建成功,則插入到列表中
101                     list.add(tl);
102                 }
103                 // 存放最新字母對應的位置
104                 letterMap.put(letter, index);
105                 index++;
106             }
107             // 添加原本的填充實體項
108             list.add(t);
109             index++;
110         }
111     }
112 
113     /**
114      * 設置主體內容.
115      * 
116      * @param dataList
117      *            實體列表
118      * @Description:
119      * @Author Justlcw
120      * @Date 2014-5-9
121      */
122     protected final void setContainerList(List<T> dataList) {
123         if (!list.isEmpty()) {
124             list.clear();
125         }
126         if (!letterMap.isEmpty()) {
127             letterMap.clear();
128         }
129 
130         char letter = ' ';
131         int index = 0;
132         for (int i = 0; i < dataList.size(); i++) {
133             T t = dataList.get(i);
134 
135             char l = getHeaderLetter(t);
136 
137             if (letter != l && l != ERROR_LETTER) {
138                 // 如果發現這個字母沒有添加過,更新一下標示
139                 letter = l;
140                 // 創建一個T類型的字母頭放進去
141                 T tl = create(letter);
142                 if (tl != null) {
143                     // 如果創建成功,則插入到列表中
144                     list.add(tl);
145                 }
146                 // 存放最新字母對應的位置
147                 letterMap.put(letter, index);
148                 index++;
149             }
150             // 添加原本的填充實體項
151             list.add(t);
152             index++;
153         }
154     }
155 
156     /**
157      * @param t
158      *            <實體item對象>
159      * 
160      * @return <實體item對象> 首字母, 獲取失敗返回 {@link #ERROR_LETTER}
161      * @Description:
162      * @Author Justlcw
163      * @Date 2014-5-12
164      */
165     private char getHeaderLetter(T t) {
166         // 獲取item對應的字符串
167         String str = getItemString(t);
168         // 如果為空,跳出繼續
169         if (TextUtils.isEmpty(str)) {
170             Log.e(TAG, "item string empty in " + t.toString());
171             return ERROR_LETTER;
172         }
173         char l;
174         // 獲取第一個字母
175         char firstChar = str.charAt(0);
176         if (firstChar == HEADER || firstChar == FOOTER || LetterUtil.isLetter(firstChar)) {
177             l = firstChar;// 如果是頭,尾,字母,直接賦值
178         } else {
179             String[] letterArray = LetterUtil.getFirstPinyin(firstChar);
180             // 如果是漢字,取拼音首字母
181             if (letterArray != null && letterArray.length > 0) {
182                 l = letterArray[0].charAt(0);
183             } else {
184                 // 如果漢字轉拼音失敗了,跳過
185                 Log.e(TAG, firstChar + " turn to letter fail, " + t.toString());
186                 return ERROR_LETTER;
187             }
188         }
189 
190         // 如果是小寫字母,轉換為大寫字母
191         if (l >= 'a') {
192             l = (char) (l - 32);
193         }
194         return l;
195     }
196 
197     @Override
198     public final int getCount() {
199         return list.size();
200     }
201 
202     @Override
203     public final View getView(int position, View convertView, ViewGroup parent) {
204         if (getItemViewType(position) == TYPE_LETTER) {
205             return getLetterView(position, convertView, parent);
206         }
207         return getContainerView(position, convertView, parent);
208     }
209 
210     @Override
211     public final int getItemViewType(int position) {
212         if (isLetter(list.get(position))) {
213             return TYPE_LETTER;
214         }
215         return TYPE_CONTAINER;
216     }
217 
218     @Override
219     public final int getViewTypeCount() {
220         return TYPE_COUNT;
221     }
222 
223     @Override
224     public boolean hideLetterNotMatch() {
225         return false;
226     }
227 
228     @Override
229     public final int getIndex(char letter) {
230         Integer index = letterMap.get(letter);
231         if (index == null) {
232             return -1;
233         }
234         return index;
235     }
236 
237     /**
238      * @param T
239      *            <實體item對象>
240      * 
241      * @return <實體item對象>對應的String,用來獲取<拼音首字母>
242      * @Description:
243      * @Author Justlcw
244      * @Date 2014-5-9
245      */
246     public abstract String getItemString(T t);
247 
248     /**
249      * @param letter
250      *            <字母>
251      * 
252      * @return 根據<字母>創建一個<實體item對象>,用來顯示<字母item>
253      * @Description:
254      * @Author Justlcw
255      * @Date 2014-5-9
256      */
257     public abstract T create(char letter);
258 
259     /**
260      * @param t
261      *            <實體item對象>
262      * 
263      * @return 根據<實體item對象>,判斷是否是<字母item>
264      * @Description:
265      * @Author Justlcw
266      * @Date 2014-5-9
267      */
268     public abstract boolean isLetter(T t);
269 
270     /**
271      * 返回 <字母item>界面,其他的同
272      * <P>
273      * {@link #getView(int, View, ViewGroup)}
274      * 
275      * @Description:
276      * @Author Justlcw
277      * @Date 2014-5-9
278      */
279     public abstract View getLetterView(int position, View convertView, ViewGroup parent);
280 
281     /**
282      * 返回<實體item>界面,其他的同
283      * <P>
284      * {@link #getView(int, View, ViewGroup)}
285      * 
286      * @Description:
287      * @Author Justlcw
288      * @Date 2014-5-9
289      */
290     public abstract View getContainerView(int position, View convertView, ViewGroup parent);
291 }
  1 package com.lixu.letterlistview.letter;
  2 
  3 import java.lang.ref.SoftReference;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 
  7 import com.lixu.lianxirenlist.R;
  8 import android.content.Context;
  9 import android.os.Handler;
 10 import android.os.Message;
 11 import android.util.AttributeSet;
 12 import android.view.Gravity;
 13 import android.view.LayoutInflater;
 14 import android.view.MotionEvent;
 15 import android.view.View;
 16 import android.view.ViewGroup;
 17 import android.widget.AbsListView;
 18 import android.widget.BaseAdapter;
 19 import android.widget.FrameLayout;
 20 import android.widget.ListView;
 21 import android.widget.TextView;
 22 import android.widget.AdapterView.OnItemClickListener;
 23 
 24 /**
 25  * 帶有字母列表的listView
 26  * 
 27  * @Title:
 28  * @Description:
 29  * @Author:Justlcw
 30  * @Since:2014-5-7
 31  * @Version:
 32  */
 33 public class LetterListView extends FrameLayout {
 34     /** 隱藏字母消息 **/
 35     private final int MSG_HIDE_LETTER = 0x0;
 36 
 37     /** 字母列表的寬度 **/
 38     private final int LETTER_LIST_VIEW_WIDTH = 50;// TODO 這裡寬度寫死了,按著一定的比例比較好
 39 
 40     /** 內容列表 **/
 41     private ListView mListView;
 42     /** 內容列表適配器 **/
 43     private LetterBaseAdapter mAdapter;
 44 
 45     /** 字母列表 **/
 46     private ListView mLetterListView;
 47     private LetterAdapter mLetterAdapter;
 48 
 49     private TextView mLetterTextView;
 50 
 51     /** 字母消息Handler **/
 52     private Handler mLetterhandler;
 53 
 54     /**
 55      * 構造方法
 56      * 
 57      * @param context
 58      */
 59     public LetterListView(Context context) {
 60         super(context);
 61         initListView(context);
 62     }
 63 
 64     /**
 65      * 構造方法
 66      * 
 67      * @param context
 68      * @param attrs
 69      */
 70     public LetterListView(Context context, AttributeSet attrs) {
 71         super(context, attrs);
 72         initListView(context);
 73     }
 74 
 75     /**
 76      * 初始化 內容列表 字母列表
 77      * 
 78      * @Description:
 79      * @Author Justlcw
 80      * @Date 2014-5-7
 81      */
 82     private void initListView(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 = new LayoutParams(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 = new LayoutParams(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 = new LayoutParams(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      * @param adapter
109      *            {@link LetterBaseAdapter}
110      * @Description:
111      * @Author Justlcw
112      * @Date 2014-5-7
113      */
114     public void setAdapter(LetterBaseAdapter adapter) {
115         if (adapter != null) {
116             mAdapter = adapter;
117             mListView.setAdapter(mAdapter);
118         }
119     }
120 
121     /**
122      * {@link AbsListView#setOnItemClickListener(OnItemClickListener)}
123      * 
124      * @Description:
125      * @Author Justlcw
126      * @Date 2014-5-14
127      */
128     public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
129         mListView.setOnItemClickListener(onItemClickListener);
130     }
131 
132     @Override
133     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
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 Justlcw
145      * @Date 2014-5-8
146      */
147     private void showLetter(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      * 處理消息 {@link LetterHandler#handleMessage(Message)}
160      * 
161      * @param msg
162      *            消息
163      * @Description:
164      * @Author Justlcw
165      * @Date 2014-5-8
166      */
167     private void handleLetterMessage(Message msg) {
168         mLetterTextView.setVisibility(View.INVISIBLE);
169         mLetterListView.setBackgroundResource(android.R.color.white);
170     }
171 
172     /** 字母欄touch事件 **/
173     private View.OnTouchListener mLetterOnTouchListener = new View.OnTouchListener() {
174         @Override
175         public boolean onTouch(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:Justlcw
201      * @Since:2014-5-7
202      * @Version:
203      */
204     private class LetterAdapter extends BaseAdapter {
205         /** 字母表 **/
206         private static final String LETTER_STR = "+ABCDEFGHIJKLMNOPQRSTUVWXYZ#";
207         /** 最終顯示的字母array **/
208         private char[] letterArray;
209         /** 每個字母的高度 **/
210         private int itemHeight;
211 
212         /**
213          * 構造方法
214          * 
215          * @param height
216          *            view height
217          */
218         public LetterAdapter(int height) {
219             if (mAdapter.hideLetterNotMatch()) {
220                 List<Character> list = new ArrayList<Character>();
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         @Override
242         public int getCount() {
243             return letterArray.length;
244         }
245 
246         @Override
247         public Object getItem(int position) {
248             return letterArray[position];
249         }
250 
251         @Override
252         public long getItemId(int position) {
253             return position;
254         }
255 
256         @Override
257         public View getView(int position, View convertView, ViewGroup parent) {
258             if (convertView == null) {
259                 convertView = new TextView(getContext());
260                 ((TextView) convertView).setTextColor(getResources().getColor(android.R.color.black));
261                 ((TextView) convertView).setGravity(Gravity.CENTER);
262                 AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
263                         itemHeight);
264                 convertView.setLayoutParams(lp);
265             }
266             ((TextView) convertView).setText(String.valueOf(letterArray[position]));
267 
268             return convertView;
269         }
270 
271         /**
272          * 獲取touch的位置
273          * 
274          * @return position
275          * @Description:
276          * @Author Justlcw
277          * @Date 2014-5-8
278          */
279         public int getTouchPoistion(int touchHeight) {
280             int position = touchHeight / itemHeight;
281             if (position >= 0 && position < getCount()) {
282                 return position;
283             }
284             return -1;
285         }
286     }
287 
288     /**
289      * 處理字母顯示的handler.
290      * 
291      * @Title:
292      * @Description:
293      * @Author:Justlcw
294      * @Since:2014-5-8
295      * @Version:
296      */
297     private static class LetterHandler extends Handler {
298         /** 弱引用 {@link LetterListView} **/
299         private SoftReference<LetterListView> srLetterListView;
300 
301         /**
302          * 構造方法
303          * 
304          * @param letterListView
305          *            {@link LetterListView}
306          */
307         public LetterHandler(LetterListView letterListView) {
308             srLetterListView = new SoftReference<LetterListView>(letterListView);
309         }
310 
311         @Override
312         public void handleMessage(Message msg) {
313             LetterListView letterListView = srLetterListView.get();
314             // 如果view沒有被銷毀掉,交給view處理這個消息
315             if (letterListView != null) {
316                 letterListView.handleLetterMessage(msg);
317             }
318         }
319     }
320 }
 1 package com.lixu.letterlistview.letter;
 2 
 3 import net.sourceforge.pinyin4j.PinyinHelper;
 4 
 5 
 6 /**
 7  * 字母工具類
 8  *@Title:
 9  *@Description:
10  *@Author:Justlcw
11  *@Since:2014-5-8
12  *@Version:
13  */
14 public class LetterUtil
15 {
16     /**
17      * @param chinese 一個漢字
18      * @return 拼音首字母
19      * @Description:
20      * @Author Justlcw
21      * @Date 2014-5-8
22      */
23     public static String[] getFirstPinyin(char chinese)
24     {
25         return PinyinHelper.toHanyuPinyinStringArray(chinese);
26     }
27     
28     /**
29      * 是否是字母
30      * 
31      * @return true 字母,false 非字母
32      * @Description:
33      * @Author Justlcw
34      * @Date 2014-5-8
35      */
36     public static boolean isLetter(char c)
37     {
38         return (c >= 65 && c <= 90) || (c >= 97 && c <= 112);
39     }
40 }

xml文件:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent" >
 5 
 6     <com.lixu.letterlistview.letter.LetterListView
 7         android:id="@+id/letterListView"
 8         android:layout_width="match_parent"
 9         android:layout_height="match_parent" >
10     </com.lixu.letterlistview.letter.LetterListView>
11 
12 </RelativeLayout>
1 <?xml version="1.0" encoding="utf-8"?>
2 <ListView xmlns:android="http://schemas.android.com/apk/res/android"
3     android:layout_width="match_parent"
4     android:layout_height="match_parent"
5     android:cacheColorHint="@android:color/transparent"
6     android:divider="@android:color/transparent"
7     android:dividerHeight="0dp"
8     android:scrollbars="none" />
1 <?xml version="1.0" encoding="utf-8"?>
2 <ListView xmlns:android="http://schemas.android.com/apk/res/android"
3     android:layout_width="match_parent"
4     android:layout_height="match_parent"
5     android:background="#f44336"
6     android:cacheColorHint="@android:color/transparent"
7     android:divider="@android:color/transparent"
8     android:dividerHeight="0dp"
9     android:scrollbars="none" />

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="wrap_content"
 4     android:layout_height="wrap_content"
 5     android:background="#f44336"
 6     android:gravity="center"
 7     android:maxWidth="70dip"
 8     android:minWidth="70dip"
 9     android:padding="10dip"
10     android:textColor="@android:color/black"
11     android:textSize="50sp" />

運行效果圖:

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved