8

2 つの質問があります。

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:上記のコードまたはその他の方法で消費されるクエリ時間を短縮するには??

誰かが私を助けてくれることを願っています。

前もって感謝します。

4

2 に答える 2

6

私はあなたの2 番目の質問にのみ答えることができます。

コンテンツ プロバイダーを照会するときに、 SQLの結合属性を使用できます。これにより、ネストされた while ループが削除され、クエリ時間が短縮されます。


編集:最初の quesについては、これを試してください:

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

私の Samsung S2 デバイスでは、連絡先が名でリストされている場合はsort_order = 1であり、姓でリストされている場合はsort_order = 2です。

于 2013-11-06T06:25:04.183 に答える
1

リスト アクティビティ用に独自の 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);
  }

ここで、並べ替え順序は、リストのデータを含むカーソルによって管理されます。

于 2013-10-25T05:07:01.723 に答える