Получить настройки порядка сортировки выбранного пользователя в разделе «Контакты»> «Настройки на устройстве Android» и «Как сократить время запроса»?

У меня есть два вопроса:

1: Как мое приложение может знать порядок сортировки по умолчанию, используемый для сортировки собственных «контактов устройств Android»?

Внутри «Контакты» -> «Настройки» в android, у нас есть опции « Список » и « Показывать контакты по» . Как я могу получить эти предварительные условия в своем приложении.

Например: предположим, что контакты устройства отсортированы по имени «Имя», тогда приложение должно получить некоторую константу (или что-то подобное). С другой стороны, если контакты сортируются по «Фамилии», то приложение должно получать константы (или информацию) относительно того же.

Я искал SO, и я получил эту ссылку , но проблема в том, что решение было устарело в API 5 .

Вот мой запрос на выбор контактов

String userPreference = getPrefContacts();/* **getPrefContacts() will return either ContactsContract.Data.DATA2 or ContactsContract.Data.DATA3** */ try { ContentResolver cr = getActivity().getContentResolver(); String[] projectionName = new String[] { ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DATA2, ContactsContract.Data.DATA5, ContactsContract.Data.DATA3, ContactsContract.Data.DATA1 }; String sortOrder = userPrefrence + " COLLATE LOCALIZED ASC"; Cursor nameCursor = cr.query(ContactsContract.Data.CONTENT_URI, projectionName, null, null, sortOrder); nameCursor.moveToFirst(); if (nameCursor.getCount() > 0) { do { String fName = nameCursor .getString(nameCursor .getColumnIndexOrThrow(ContactsContract.Data.DATA2)); String mName = nameCursor .getString(nameCursor .getColumnIndexOrThrow(ContactsContract.Data.DATA5)); String lName = nameCursor .getString(nameCursor .getColumnIndexOrThrow(ContactsContract.Data.DATA3)); String name = nameCursor .getString(nameCursor .getColumnIndexOrThrow(ContactsContract.Data.DATA1)); if (name != null) { String[] projectionCommon = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.HAS_PHONE_NUMBER }; String selectionCommon = ContactsContract.Contacts.DISPLAY_NAME + " = ?"; String[] selectionArgCommon = new String[] { name }; Cursor common = cr.query( ContactsContract.Contacts.CONTENT_URI, projectionCommon, selectionCommon, selectionArgCommon, null); if (common.getCount() > 0) { while (common.moveToNext()) { String contactID = common .getString(common .getColumnIndexOrThrow(ContactsContract.Contacts._ID)); int hasPhone = common .getInt(common .getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER)); if (hasPhone > 0) { String[] projectionPhone = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }; String selectionPhone = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?"; String[] selectionArgPhone = new String[] { contactID }; Cursor phoneCursor = cr .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projectionPhone, selectionPhone, selectionArgPhone, null); if (phoneCursor.getCount() > 0) { while (phoneCursor.moveToNext()) { String phone = phoneCursor .getString(phoneCursor .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); if (phone != null) { ContactData tmp = new ContactData( name, fName, mName, lName, phone, contactID); if (raw.size() == 0) { raw.add(tmp); } else if (!(raw .get(raw.size() - 1)) .getContactID() .equalsIgnoreCase( tmp.getContactID())) { raw.add(tmp); } } } } phoneCursor.close(); } } } common.close(); } } while (nameCursor.moveToNext()); nameCursor.close(); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } 

Мне нужен код для метода getPrefContacts ()

2: Как уменьшить время запроса, затрачиваемое по отношению к вышеуказанному коду или любым другим способом сделать это?

Надеюсь, кто-нибудь может мне помочь.

Заранее спасибо.

Я могу ответить только на ваши второй вопрос .

Вы можете использовать атрибут join SQL при запросе поставщиков контента. Таким образом, удаление вложенных циклов и, следовательно, сокращение времени запроса.


Изменить: для ваших первых запросов попробуйте следующее:

Int sort_order = Settings.system.getInt (getApplicationContext () .getContentResolver (), "android.contacts.SORT_ORDER");

На моем устройстве Samsung S2 sort_order = 1, когда контакты указаны по первому имени и sort_order = 2, когда контакты указаны по имени .

Вы можете управлять порядком сортировки в своей активности списка, когда вы создаете свой собственный CustomAdapter для активности списка.

Фильтрация и сортировка данных осуществляется адаптером. Вам необходимо реализовать логику в реализации пользовательского адаптера.

Адаптер назначается ListView с помощью метода setAdapter объекта ListView.

Например,

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Cursor mCursor = getContacts(); startManagingCursor(mCursor); // now create a new list adapter bound to the cursor. // SimpleListAdapter is designed for binding to a Cursor. ListAdapter adapter = new SimpleCursorAdapter(this, // Context. android.R.layout.two_line_list_item, // Specify the row template // to use (here, two // columns bound to the // two retrieved cursor // rows). mCursor, // Pass in the cursor to bind to. // Array of cursor columns to bind to. new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }, // Parallel array of which template objects to bind to those // columns. new int[] { android.R.id.text1, android.R.id.text2 }); // Bind to our new adapter. setListAdapter(adapter); } private Cursor getContacts() { // Run query Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + ("1") + "'"; String[] selectionArgs = null; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; return managedQuery(uri, projection, selection, selectionArgs, sortOrder); } 

Здесь порядок сортировки управляется с помощью курсора, который содержит данные для списка.