2012-09-13 21 views
6

Se están discutiendo muchas cosas sobre el mismo tema, pero después de pasar 4 horas aquí, no pude encontrar una descripción válida o un enlace para crear un Selector de contactos con la casilla de verificación.Selector de contactos de Android con casilla de verificación

Tengo una actividad con HECHO botón y listview con checkbox. Logré mostrar los contactos correctamente. Ahora quiero devolver los números de teléfono de contacto seleccionados en un bundle (creo que la mejor manera) para que pueda obtener la lista de números en onActivityResult(). No estoy seguro de la forma en que estoy siguiendo es correcto o no.

Aquí está mi código:

public class ContactPickerMulti extends ListActivity implements OnClickListener { 

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

    Button save_button; 
    private TextView phone; 
    private String phoneNumber; 
    private Cursor cursor; 

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

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

     // 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.contact_done: 

      SparseBooleanArray selectedPositions = myListView 
        .getCheckedItemPositions(); 
      SparseBooleanArray checkedPositions = myListView 
        .getCheckedItemPositions(); 
      if (checkedPositions != null) { 
       for (int k = 0; k < checkedPositions.size(); k++) { 
        if (checkedPositions.valueAt(k)) { 
          String name = 
           ((Cursor)myListView.getAdapter().getItem(k)).getString(1); 
          Log.i("XXXX",name + " was selected"); 
         } 
       } 
      } 

      break; 
     } 

    } 
} 

Quiero enviar los números como matriz o lista. ¿Cuál es la mejor manera de hacer esto? Cualquier ayuda o camino correcto es muy apreciada.

+0

Por favor agregar el código del adaptador, así que puede sabe cómo obtiene phoneNumber. –

+0

Código @Yul actualizado ... Ahora imprimirá el nombre del contacto :) Solo necesito obtener el número de teléfono en lugar del nombre;) ¡Terminado! –

Respuesta

3

utilizo este código en onClick:

long[] id = getListView().getCheckedItemIds();// i get the checked contact_id instead of position 
     phoneNumber = new String[id.length]; 
     for (int i = 0; i < id.length; i++) { 

      phoneNumber[i] = getPhoneNumber(id[i]); // get phonenumber from selected id 

     } 

     Intent pickContactIntent = new Intent(); 
     pickContactIntent.putExtra("PICK_CONTACT", phoneNumber);// Add checked phonenumber in intent and finish current activity. 
     setResult(RESULT_OK, pickContactIntent); 
     finish(); 

//

private String getPhoneNumber(long id) { 
    String phone = null; 
    Cursor phonesCursor = null; 
    phonesCursor = queryPhoneNumbers(id); 
    if (phonesCursor == null || phonesCursor.getCount() == 0) { 
     // No valid number 
     signalError(); 
     return null; 
    } else if (phonesCursor.getCount() == 1) { 
     // only one number, call it. 
     phone = phonesCursor.getString(phonesCursor 
       .getColumnIndex(Phone.NUMBER)); 
    } else { 
     phonesCursor.moveToPosition(-1); 
     while (phonesCursor.moveToNext()) { 

      // Found super primary, call it. 
      phone = phonesCursor.getString(phonesCursor 
        .getColumnIndex(Phone.NUMBER)); 
      break; 

     } 
    } 

    return phone; 
} 


private Cursor queryPhoneNumbers(long contactId) { 
    ContentResolver cr = getContentResolver(); 
    Uri baseUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, 
      contactId); 
    Uri dataUri = Uri.withAppendedPath(baseUri, 
      ContactsContract.Contacts.Data.CONTENT_DIRECTORY); 

    Cursor c = cr.query(dataUri, new String[] { Phone._ID, Phone.NUMBER, 
      Phone.IS_SUPER_PRIMARY, RawContacts.ACCOUNT_TYPE, Phone.TYPE, 
      Phone.LABEL }, Data.MIMETYPE + "=?", 
      new String[] { Phone.CONTENT_ITEM_TYPE }, null); 
    if (c != null && c.moveToFirst()) { 
     return c; 
    } 
    return null; 
} 

Y la última onActivityResult de la actividad que se inicia PickContactsActivity

// TODO Auto-generated method stub 
    // super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK) { 

     if (requestCode == Constants.REQUEST_CODE_PICK_CONTACT) { 


      if (data != null) { 

       String[] temp = data.getStringArrayExtra("PICK_CONTACT"); 

      } 
     } 

    } 

} 
+0

Gracias por su respuesta. Muchas gracias. Por cierto estoy teniendo errores, 'phonesCursor = queryPhoneNumbers (id);' qué debo hacer en 'queryPhoneNumbers (id);' –

+0

Esa es la identificación del contacto marcado que obtuvo en 'onClick'' getPhoneNumber (id [i]); '. Estoy usando este código para mi aplicación, así que lo aseguro. Así que solo tiene que cambiar un poco para adaptarse al suyo –

+0

Estoy completamente perdido en algún lado, aquí está mi código actual http://pastebin.com/tdTpFR6t ¿puede echar un vistazo por favor? –

2

Al utilizar startActivityForResult(newActivity) en el newActivity debe hacer una llamada a setResult(RESULT_OK) seguido por finish() para cerrar la Activity. Opcionalmente puede incluir un Intent en la llamada al setResult(RESULT_OK, intent). La llamada al setResult() llevará a llamar a su implementación de onActivityResult() donde puede manejar el resultado del Activity. Entonces, en su caso, simplemente crearía un Intenet y agregaría su lista de matriz utilizando uno de los métodos putExtra(). Ese Intent se pasará al onActivityResult() donde puede extraer esa información. Consulte Intent y Activity para obtener más información.

+0

gracias por su respuesta. He actualizado el código y ahora puedo obtener la posición del elemento verificado. Entonces, ¿cómo puedo obtener la información de contacto? Quiero decir que solo tengo la posición del artículo y ¿cómo puedo consultar para hacer la LISTA? ¿Alguna idea? –

+0

Puede obtener cualquier tipo de información, ¿dónde está el problema? Solo ponga una ArrayList o algo así. –

Cuestiones relacionadas