2012-06-26 28 views
7

Hice una aplicación usando sincronización de contactos. Enumero la siguiente información de contacto con foto, nombre y número. Listo con éxito todas esas cosas en un ListView personalizado, pero no puedo hacer clic en el ListView. Parece bloqueado, no se puede hacer clic en él.No puedo hacer clic en ListView en Android?

Pero hice el mismo procedimiento para otra actividad. Usando personalizado, ListView pero puedo hacer clic en esta vista y funciona bien.

¿Cuál es el problema? aquí está mi codificación de ejemplo:

ListView settingsList = (ListView) findViewById(R.id.manage_track_listView); 
    ArrayList<ContactList> MySettingsList = new ArrayList<ContactList>(); 

    ContactList setting1 = new ContactList("contact name 1", "Number 1", null); 
    ContactList setting2 = new ContactList("contact name 2", "Number 2", null); 
    ContactList setting3 = new ContactList("contact name 3", "Number 3", null); 

    MySettingsList.add(setting1); 
    MySettingsList.add(setting2); 
    MySettingsList.add(setting3); 

    ContactList list[] = new ContactList[MySettingsList.size()]; 

    for(int i=0;i<MySettingsList.size();i++) { 

     ContactList mySettings = MySettingsList.get(i); 
     list[i] = new ContactList(mySettings.getName(), mySettings.getNumber(), mySettings.getImageIcon()); 
    } 

    ContactListAdapter adapter = new ContactListAdapter(this, R.layout.manage_track_list_custom_view, list); 
    settingsList.setAdapter(adapter); 
    System.out.println("before listener"); 
    settingsList.setOnItemClickListener(new OnItemClickListener() { 

     @Override 


     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 
      // TODO Auto-generated method stub 

      System.out.println("Clicked " + position); 
     } 
    }); 
    System.out.println("after listener"); 

Aquí lista de contactos es una clase que no tiene nombre, el número, y el byte [] para imageBlob. Si la imagen es nula, configuro el ic_launcher predeterminado como una imagen de contacto. La clase de adaptador es:

public class ContactListAdapter extends ArrayAdapter<ContactList> { 

    Context context; 
    int layoutResourceId; 
    ContactList objects[] = null; 

    View row; 

    public ContactListAdapter(Context context, int layoutResourceId, ContactList[] objects) { 
     super(context, layoutResourceId, objects); 
     // TODO Auto-generated constructor stub 

     this.context = context; 
     this.layoutResourceId = layoutResourceId; 
     this.objects = objects; 
     System.out.println(objects[1].getName()); 
     System.out.println(objects[1].getNumber()); 
     System.out.println(objects[1].getImageIcon()); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     row = convertView; 
     final ContactListHolder holder; 

     if (row == null) { 

      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ContactListHolder(); 
      holder.image = (ImageView) row.findViewById(R.id.contactImage); 
      holder.name  = (TextView) row.findViewById(R.id.contactName); 
      holder.number = (TextView) row.findViewById(R.id.contactNumber); 
      holder.check = (CheckBox) row.findViewById(R.id.selectedContact); 

      row.setTag(holder); 

     } else { 

      holder = (ContactListHolder)row.getTag(); 
     } 

     ContactList contact = objects[position]; 
     if(contact.imageIcon != null) { 

      Bitmap imgBitmap = BitmapFactory.decodeByteArray(contact.imageIcon, 0, contact.imageIcon.length); 
      holder.image.setImageBitmap(imgBitmap); 
     } else { 

      holder.image.setImageResource(R.drawable.ic_launcher); 
     } 

     holder.name.setText(contact.name); 
     holder.number.setText(contact.number); 
     holder.check.setChecked(objects[position].isSelected());  

     return row; 

    } 

    static class ContactListHolder { 

     ImageView image; 
     TextView name; 
     TextView number; 
     CheckBox check; 
    } 
} 

tengo más de 100 contactos por lo que añaden sólo 3 objetos. En esta lista de contactos recibo con éxito la imagen de contacto, nombre, número.

¿Cuál es el problema ListView no puede hacer clic? Espero que alguno de ustedes me guíe. Gracias por adelantado.


Gracias a todos. ahora obtuve el resultado al solo agregar android:focusable="false" en mis vistas de todos los elementos secundarios. gracias por tus guidings.

Respuesta

8

en Vistas anidadas, la vista secundaria siempre obtiene todos los eventos táctiles primero. si desea la vista principal (en su caso, la fila listView), para obtener un evento táctil, debe devolver false en los eventos secundarios o configurarlos para que sean android:clickable="false" en el manifiesto.

+0

este método no funciona? cualquier otra solución – Amarnath

+0

Gracias amigo ahora funciona. – Amarnath

+0

si funciona, no dude en aceptar la respuesta – thepoosh

7

añadir

android:focusable="false" 

y

android:clickable="false" 

para cada niño, vista como imageview, TextView, casilla de verificación, etc ... de la fila significa diseño en manage_track_list_custom_view.xml

3

I cree que tiene que configurar todos sus elementos seleccionables, por ej. casillas de verificación, botones, etc. como no enfocables (en la clase de adaptador).

 holder.yourButton.setFocusable(false); 
     holder.yourButton.setFocusableInTouchMode(false); 

     holder.yourCheckbox.setFocusable(false); 
     holder.yourCheckbox.setFocusableInTouchMode(false); 
0

Puede establecer onclick listner en la fila Vista de la clase ContactListAdapter.

holder.check.setChecked(objects[position].isSelected());  
     row.setOnclickListner(new Onclicklistner(){ 
      // Your code here 
     }); 
    return row; 
1

Prueba esto:

Cuando se agrega la vista de lista, llame

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS); 

Tener una mirada here para obtener más información.

+1

Creo que esto debe marcarse como la respuesta, ya que permite hacer clic en los elementos dentro de una vista de lista al mismo tiempo que los elementos de la lista para recibir eventos. – lfxgroove

0

Tengo el mismo problema cuando no puedo hacer clic en otra parte de un elemento en la vista de lista, solo puedo hacer clic en textview o imageview dentro de ese elemento.Así que me puse mi TextView:

android:layout_width="fill_parent" 

mi artículo como éste:

<relative> 
[image][textview] 
relative/> 

y el evento clic funcionó bien porque hago clic en el TextView. Hope ayudará a cualquiera a tener el mismo problema.

Cuestiones relacionadas