如何擷取android手機連絡人並按字母展示(一)
android提供了本機資料庫的查詢uri,可以查詢出資料:
採用一個AsyncQueryHandler來進行查詢, AsyncQueryHandler自己開啟了線程來進行資料查詢,很方便
protected AsyncQueryHandler mQueryHandler;protected final void queryPersonal() {mQueryHandler.startQuery(QUERY_TOKEN, null, ContactsContract.Contacts.CONTENT_URI, Personal.CONTACTS_SUMMARY_PROJECTION, null, null, getSortOrder(ContactsContract.Contacts.DISPLAY_NAME));}protected static String getSortOrder(String fieldName) {//substr為截取函數,取第一個字母//COLLATE主要用於對字元進行排//COLLATE LOCALIZED 按本地語言進行排序return "CASE WHEN substr(UPPER(" + fieldName + "), 1, 1) BETWEEN 'A' AND 'Z' THEN 1 else 10 END," +fieldName + " COLLATE LOCALIZED ASC";}protected final class MyHandler extends AsyncQueryHandler { /** * Asynchronous query handler constructor. */public MyHandler(Context context) {super(context.getContentResolver());}/** * On query completion. */@Overrideprotected void onQueryComplete(int token, Object cookie, Cursor cursor) { //handler查詢完的回調if (cursor == null || cursor.isClosed()) {return;}if (!isFinishing()) {setLoading(false);if (mAdapter != null) {mAdapter.setLoading(false);mAdapter.changeCursor(cursor);} if (cursor.getCount() == 0) {mEmtytext.setVisibility(View.VISIBLE);} else {mEmtytext.setVisibility(View.INVISIBLE);}} else {if (cursor != null && !cursor.isClosed()) {cursor.close();}}}}
這個Layout是:
然後是list adapter的寫法:
protected static final class SectionedContactListItemCache {public TextView sectionHeader;public TextView nameView;public TextView typeView;public ImageView photoView;public ImageView detailItemIcon; public View nameTypeWrapper;}protected final class ContactsAdapter extends ResourceCursorAdapter {public ContactsAdapter(Context context) {super(context, R.layout.contacts_list_item_photo,null);}@Overridepublic void changeCursor(Cursor c) {super.changeCursor(c);}protected String getTitle(String displayName) {String title;/** check if the first letter is English letter */Matcher matcher = mPattern.matcher(displayName);if (!matcher.find()) {title = NONE_ENGLISH_LETTER_TITLE;} else {title = displayName.trim().substring(0, 1).toUpperCase(Locale.US);}return title;}protected String getDisplayName(Cursor c) {String displayName = c.getString(Personal.NAME_COLUMN_INDEX);if(TextUtils.isEmpty(displayName)) {return "";}return displayName;}@Overridepublic void bindView(View view, Context context, Cursor cursor) {final SectionedContactListItemCache cache = (SectionedContactListItemCache) view.getTag();cache.typeView.setVisibility(View.GONE);cache.photoView.setVisibility(View.VISIBLE);String name = cursor.getString(Personal.NAME_COLUMN_INDEX);if (TextUtils.isEmpty(name)) {cache.nameView.setText(R.string.contact_no_name);} else {cache.nameView.setText(name);}}@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {View view = super.newView(context, cursor, parent);final SectionedContactListItemCache cache = new SectionedContactListItemCache(); cache.nameTypeWrapper = view.findViewById(R.id.name_type);cache.sectionHeader = (TextView) view.findViewById(R.id.txtSectionHeader);cache.nameView = (TextView) view.findViewById(R.id.name);cache.typeView = (TextView) view.findViewById(R.id.type);cache.photoView = (ImageView) view.findViewById(R.id.photo);cache.detailItemIcon = (ImageView) view.findViewById(R.id.contacts_detail_item_icon);view.setTag(cache);return view;}}//end of adapter
item adapter的layout: