2013-10-24 11 views
8

Ich habe zwei Fragen:Wählen Sie den Benutzer für die Sortierreihenfolge aus, der unter Kontakte> Einstellungen in Android-Gerät ausgewählt ist.

1: Wie kann weiß, dass meine Anwendung Standardreihenfolge für die Sortierung native „Android Geräte-Kontakte“ verwendet Sortierung?

Inside „Kontakte“ -> „Einstellungen“ im Android haben wir „Liste von“ und „Anzeige Kontakte von“ Optionen. Wie kann ich diese Präferenzen in meiner Anwendung erhalten?

Zum Beispiel: Angenommen, Gerätekontakte werden nach "Vorname" sortiert, dann sollte die Anwendung eine Konstante erhalten (oder etwas Ähnliches). Auf der anderen Seite, wenn Kontakte nach "Nachname" sortiert sind, sollte die Anwendung Konstanten (oder Informationen) bezüglich derselben erhalten.

Ich suchte SO und ich habe diese link, aber das Problem ist, dass die Lösung in API-Ebene weiterentwickelt wurde.

Hier ist meine Abfrage zum Abrufen von Kontakten

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(); 
      } 

Ich brauche Code für getPrefContacts()Methode

2: Wie die Abfragezeit in Bezug auf obigen Code verbraucht reduzieren oder eine andere Möglichkeit?

Hoffe, dass jemand mir helfen kann.

Vielen Dank im Voraus.

Antwort

4

Ich kann nur Ihre zweite Frage beantworten.

Sie können die Attribut SQL beitreten, wenn die Content-Provider abfragen. Dadurch werden verschachtelte while-Schleifen entfernt und somit die Abfragezeit reduziert.


Edit: Für Ihren ersten ques, versuchen Sie dies:

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

Auf meinem Samsung S2 Gerät, sort_order = 1, wenn die Kontakte von Vornamen aufgeführt sind und sort_order = 2, wenn die Kontakte von Nachnamen aufgeführt sind.

+0

Ja, Sie haben Recht mit dem Attribut ** join **. – Susomrof

1

Sie können die Sortierreihenfolge in Ihrer Listenaktivität verwalten, wenn Sie einen eigenen CustomAdapter für die Listenaktivität erstellen.

Die Filterung und Sortierung der Daten erfolgt über den Adapter. Sie müssen die Logik in Ihrer benutzerdefinierten Adapterimplementierung implementieren.

Der Adapter wird der ListView über die setAdapter-Methode für das ListView-Objekt zugewiesen.

für zB

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); 
    } 

Hier Sortierreihenfolge wird durch den Cursor verwaltet, die die Daten für die Liste enthält.

+1

aber ich möchte wissen: In welcher Reihenfolge sortiert Gerät, d. H. Was ist der Benutzer Pref für ** Liste von ** Option (Liste von: ** Vorname ** oder ** Nachname **). – Susomrof