Lista de selección de contactos múltiples

Tengo una lista de selección de contactos con casillas de verificación de los contactos que tienen un número de teléfono. Ahora, mi problema es que parece que no puedo obtener el nombre y el número de teléfono del contacto verificado.

Aquí está mi código:

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

      }
    }

¿Alguna idea?

¡¡Gracias!!

preguntado el 01 de julio de 12 a las 17:07

1 Respuestas

Parece que estás tan cerca que usé ListView.getCheckedItemIds() para devolver las identificaciones únicas de los contactos seleccionados:

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

Adición

Tengo una pregunta rápida sobre este código:

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

¿Esto devuelve al usuario a un anterior ¿Actividad? Si es así, deberías usar finish(); en cambio. finish() finaliza la Actividad actual, sacándola de la pila y liberando cualquier memoria (menos memoria desperdiciada significa una aplicación más rápida). También permite que la Actividad anterior restaure el estado guardado cuando se fue (completado en EditTexts, selecciones anteriores de Spinner , botón de alternar y marcas de verificación, etc.) La actividad se reanuda donde la dejó el usuario.

Respondido 01 Jul 12, 18:07

Sí, vuelve a una actividad anterior y agregaré lo que dijiste. Además, solo verifiqué brevemente lo que publicaste, pero creo que funciona muy bien, terminaré de verificarlo más tarde. ¡¡¡Gracias!!! - user1476876

@user1476876 Si esta respuesta lo ayudó, haga clic en la marca de verificación en la esquina superior izquierda. - Diana

Como una advertencia para otros que vean esta respuesta. No debe llamar a ContentResolver.query en el hilo principal. Corre el riesgo de obtener un ANR ya que la llamada realizará una E/S de archivo. Cargue los contactos en un Loader o AsyncTask o similar. También puede editar la consulta para cargar todos los contactos relevantes en una consulta en lugar de una consulta por contacto. - Martín Wallgren

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.