2012-10-13 184 views
11

Estoy tratando de hacer múltiples selectores de contactos para mi aplicación. Estoy usando un diseño personalizado con casilla de verificación para seleccionar contacto múltiple. El problema que estoy enfrentando es que para seleccionar cualquier contacto en particular, necesito hacer clic exactamente en la casilla de verificación, si hago clic en otra parte de la fila, la casilla de verificación no se marca. ¿Cómo puedo asegurarme de que cada vez que el usuario haga clic en toda la fila, la casilla de verificación quede marcada?cómo hacer clic en toda la fila de la vista de lista?

activity_contacts_picker.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<Button 
    android:id="@+id/btnShow" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Show Selected" /> 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/btnShow" > 
</ListView> 

</RelativeLayout> 

custcontactview.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/linearLayout1" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:paddingBottom="5.0px" 
android:paddingLeft="5.0px" 
android:paddingTop="5.0px" > 

<TextView 
    android:id="@+id/txtContactName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="15.0dip" 
    android:layout_toLeftOf="@+id/checkBox1" 
    android:layout_alignParentLeft="true" 
    android:text="Medium Text" 
    android:textAppearance="?android:textAppearanceMedium" /> 

<TextView 
    android:id="@+id/txtContactNumber" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/txtContactName" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="15.0dip" 
    android:layout_toLeftOf="@+id/checkBox1" 
    android:text="Small Text" 
    android:textAppearance="?android:textAppearanceSmall" /> 

<CheckBox 
    android:id="@+id/checkBox1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="10dp" 
    android:clickable="true" 
    android:focusable="true" 
    android:focusableInTouchMode="false" /> 

</RelativeLayout> 

ContactsPicker.java

public class ContactsPicker extends ListActivity { 

protected Object mActionMode; 
public int selectedItem = -1; 
private Button btnShowContacts; 
private ListView myListView; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_contacts_picker); 
    myListView = getListView(); 
    btnShowContacts = (Button) findViewById(R.id.btnShow); 
    btnShowContacts.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Toast.makeText(getApplicationContext(), "Button Clicked", 
        Toast.LENGTH_SHORT).show(); 
      String name = null; 
      String number = null; 
      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); 
       while (contact.moveToNext()) { 
        name = contact.getString(contact 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
        number = contact.getString(contact 
          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
       } 
       Toast.makeText(getApplicationContext(), 
         "Name: " + name + "\n" + "Number: " + number, 
         Toast.LENGTH_LONG).show(); 
      } 
     } 
    }); 
    ArrayList<Map<String, String>> list = buildData(); 
    String[] from = { "Name", "Phone" }; 
    int[] to = { R.id.txtContactName, R.id.txtContactNumber }; 
    SimpleAdapter adapter = new SimpleAdapter(this, list, 
      R.layout.custcontactview, from, to); 
    setListAdapter(adapter); 
} 

private ArrayList<Map<String, String>> buildData() { 
    ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>(); 
    list.clear(); 
    Cursor people = getContentResolver().query(
      ContactsContract.Contacts.CONTENT_URI, null, null, null, 
      "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC"); 
    while (people.moveToNext()) { 
     String contactName = people.getString(people 
       .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     String contactId = people.getString(people 
       .getColumnIndex(ContactsContract.Contacts._ID)); 
     String hasPhone = people 
       .getString(people 
         .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
     if ((Integer.parseInt(hasPhone) > 0)) { 
      Cursor phones = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
          + " = " + contactId, 
        null, 
        "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME 
          + ") ASC"); 
      while (phones.moveToNext()) { 
       String phoneNumber = phones 
         .getString(phones 
           .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
       Map<String, String> NamePhoneType = new HashMap<String, String>(); 
       NamePhoneType.put("Name", contactName); 
       NamePhoneType.put("Phone", phoneNumber); 
       list.add(NamePhoneType); 
      } 
      phones.close(); 
     } 
    } 
    people.close(); 
    //startManagingCursor(people); 
    return list; 
} 
} 

Respuesta

11

Trate de añadir este atributo a su ListView

androide: se puede hacer clic = "true"

Además, no veo donde está configurando Touch/Click oyente a su MyListView.

1

Yo añadiría un detector de clics para el campo de texto y si hace clic en el cambio del estado de la casilla de verificación a su estado opuesto (clic < -> unclicked)

1

primer lugar se puede utilizar en lugar CheckedTextView casilla de verificación. Tal vez solo este trabajo.

o

Trate de establecer CheckBox enfocable = "false", si no funciona, entonces enfocable en toda Vista desde su diseño XML.

6

trate de cambiar el ancho de la disposición casilla de verificación para llenar los padres de la siguiente manera,

android:layout_width="fill_parent" 

supongo que funcionará para ti :)

0

si utiliza el botón/casilla/botón de radio en la lista de elementos a continuación la lista no se puede hacer clic en el elemento

puede resolver su problema por click here

Cuestiones relacionadas