2

У меня есть список выбора контактов с ячейками контактов, у которых есть номер телефона. Теперь моя проблема заключается в том, что не может быть получено имя и номер телефона проверенного контакта.Список контактов для нескольких контактов

Вот мой код:

import android.app.ListActivity; 
    import android.content.ContentResolver; 
    import android.content.Intent; 
    import android.database.Cursor; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.provider.ContactsContract; 
    import android.provider.ContactsContract.CommonDataKinds.Phone; 
    import android.util.Log; 
    import android.util.SparseBooleanArray; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.ListAdapter; 
    import android.widget.ListView; 
    import android.widget.SimpleCursorAdapter; 

    public class Create_Group extends ListActivity implements OnClickListener{ 

     // List variables 
     public String[] Contacts = {}; 
     public int[] to = {}; 
     public ListView myListView; 

     Button save_button; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.create_group); 

      // Initializing the buttons according to their ID 
      save_button = (Button)findViewById(R.id.save_group_button); 

      // Defines listeners for the buttons 
      save_button.setOnClickListener(this); 

      Cursor mCursor = getContacts(); 
      startManagingCursor(mCursor); 

      ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, mCursor, 
                  Contacts = new String[] {ContactsContract.Contacts.DISPLAY_NAME }, 
                  to = new int[] { android.R.id.text1 }); 
      setListAdapter(adapter); 
      myListView = getListView(); 
      myListView.setItemsCanFocus(false); 
      myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

     } 

     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.HAS_PHONE_NUMBER + " = '" 
        + ("1") + "'"; 
      String[] selectionArgs = null; 
      String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
        + " COLLATE LOCALIZED ASC"; 

      return managedQuery(uri, projection, selection, selectionArgs, 
        sortOrder); 
     } 

     public void onClick(View src) { 
      Intent i; 
      switch (src.getId()) 
      { 
      case R.id.save_group_button: 

       int checked_Names_Counter = 0; 

       // Goes over the list of contacts and checks which were checked 
       for (int j = 0; j < myListView.getCount(); j++) 
       { 
        if (myListView.isItemChecked(j) == true) 
        { 
         Cursor cur = getContacts(); 
         ContentResolver contect_resolver = getContentResolver(); 
         cur.moveToFirst(); 

         /** 
         * Here I tried to compare the IDs but each list has different IDs so it didn't really help me... 
         // Converts the current checked name ID into a String 
         String Checked_ID = String.valueOf(myListView.getCheckedItemIds()[checked_Names_Counter]); 

         // Checks if the current checked ID matches the cursors ID, if not move the cursor to the next name 
         while (Checked_ID != cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID))) 
         { 
          cur.moveToNext(); 
         } 
         */ 

         /** 
         * Here I tried to compare the names, even though it's not a good pratice, and it didn't work either... 
         String Checked_Name = myListView.getAdapter().getItem(checked_Names_Counter).toString(); 

         // Checks if the current checked ID matches the cursors ID, if not move the cursor to the next name 
         while (Checked_Name != cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME))) 
         { 
          cur.moveToNext(); 
         } 
         */ 
         String id = cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); 
         String name = ""; 
         String no = ""; 

         Cursor phoneCur = contect_resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
           ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); 


         name = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
         no = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         id = null; 
         name = null; 
         no = null; 
         phoneCur = null; 
         checked_Names_Counter++; 

        } 
       } 

       // Goes back to the Manage Groups screen 
       i = new Intent(this, Manage_Groups.class); 
       startActivity(i); 
       break; 
     } 

     } 
    } 

Любые идеи?

Спасибо!

ответ

2

Похоже, ты так близко, я ListView.getCheckedItemIds() возвращать уникальные идентификаторы выбранных контактов:

public void onClick(View view) { 
    long[] ids = myListView.getCheckedItemIds(); 
    for(long id : ids) { 
     Cursor contact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id + "" }, null); 

     // Do whatever you want with the data 
    } 
} 

Сложение

у меня есть быстрый вопрос по этому коду :

// Goes back to the Manage Groups screen 
i = new Intent(this, Manage_Groups.class); 
startActivity(i); 

Приносит ли это пользователю вернуться к предыдущему Деятельность? Если это так, вы должны использовать вместо этого finish();. finish() завершает текущую активность, снимая ее с стека и освобождая любую память (меньшее количество потерянной памяти означает более быстрое приложение). Она также позволяет предыдущему действию восстанавливать сохраненное состояние, когда оно осталось (заполнено EditTexts, предыдущие варианты Spinner , кнопка переключения и галочки и т. д.). Активность возобновляется, когда пользователь остановился.

+0

Да, он возвращается к предыдущему действию, и я добавлю то, что вы сказали. Кроме того, я только проверил, что вы написали кратко, но я думаю, что это отлично работает, я закончу проверку позже. Благодаря!!! – user1476876

+0

@ user1476876 Если этот ответ помог вам, нажмите галочку в верхнем левом углу. – Sam

+2

Как предупреждение для других, видящих этот ответ. Вы не должны вызывать ContentResolver.query в основном потоке. Вы рискуете получить ANR, так как вызов будет выполнять файл IO. Загрузите контакты в Loader или AsyncTask или аналогичные. Вы также можете отредактировать запрос для загрузки всех релевантных контактов в одном запросе вместо одного запроса на контакт. –

 Смежные вопросы

  • Нет связанных вопросов^_^