2010-01-20 38 views
43

¿Es posible utilizar un OnItemClickListener en un ListView cuando el diseño Items tiene un widget seleccionable/editable (RadioButton, EditText o CheckBox)?ListView con widget seleccionable/editable

+0

Extiende ListActivity en lugar de la actividad. consulte http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/ –

Respuesta

67

Es posible que desee echar un vistazo a this issue. Tener un elemento enfocable en una fila de ListView provoca que NO se invoque el OnItemClickListener. Sin embargo, eso no significa que no pueda tener elementos enfocables/clicables en una fila, hay algunas soluciones como this one.

Además, puede echar un vistazo a la pantalla Registros de llamadas. Tiene un ListView con elemento seleccionable (el ícono de llamada a la derecha). See Source code here

+4

Ayuda rápida: "Una forma fácil de solucionar este problema es llamar al " setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS); " en las vistas de lista de lista a medida que se agregan. Podrá seleccionar filas, hacer clic en las filas y hacer clic en las casillas de verificación y botones secundarios. " - Esta es una cita del comentario # 27 en la página referida por dos de los enlaces en la respuesta anterior. ¡¡Muchas gracias!! –

+1

El enlace a la solución 1 está roto. ¿Alguien puede editar esto? – Martze

+0

solo el primer enlace está funcionando, los otros están rotos, arregle eso – BBdev

20

Citando el comentario # 31 en el enlace mencionado por Samuh (que resolvió el problema para mí):

De hecho, usted puede agregarlo a la XML diseño (si es inflado por uno): android: descenddantFocusability = "blocksDescendants".

Agregando aquí JIC esa página web está inactiva en el futuro.

10

Si cualquier elemento de la fila de la lista contiene una vista enfocable o clicable, OnItemClickListener no funcionará.

elemento de la fila debe estar teniendo parámetro como android:descendantFocusability="blocksDescendants"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:baselineAligned="false" 
    android:descendantFocusability="blocksDescendants" 
    android:gravity="center_vertical" > 

    // your other widgets here 

</LinearLayout> 
1

intentado muchas soluciones complejas, pero era la más simple que funcionó:

androide: enfocable = "false"

<CheckBox 
    android:id="@+id/fav_check_box" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusable="false" /> 
0

Dos mejor solución

  1. Añadir android:descendantFocusability="beforeDescendants" a Listview en XML O
  2. conjunto dado dos atributos a false

como

android:focusable="false" 
    android:focusableInTouchMode="false" 

Luego se manejará el niño elemento de la fila Listview (Button, EditarTexto etc) eventos en lugar de listView.setOnItemClick.

0

me fijo mi problema diferente, en mi artículo que tener más de un LinearLayout por lo que si usted da a su identificación y linearayout setOnclickListener en clase adaptador que va a funcionar, sólo el efecto original de tocar desaparecerá. pero este enlace Making a LinearLayout act like an Button es ventajosa para hacer acto linearlaout como botón de clic

elemento

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="10dp"> 

    <TextView 
     android:id="@+id/txt_item_followers_name" 
     android:layout_width="250dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:gravity="center|start" 
     android:paddingLeft="15dp" 
     android:text="Ali" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="35dp" 
     android:layout_height="35dp" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/txt_item_followers_name" 
     android:layout_marginLeft="10dp" 
     android:src="@drawable/puan_icon" /> 

    <TextView 
     android:id="@+id/txt_item_followers_mark" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/imageView" 
     android:layout_toEndOf="@+id/imageView" 
     android:background="@color/red_400" 
     android:paddingLeft="10dp" 
     android:text="25.5" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <LinearLayout 
     android:id="@+id/linear_one" 
     android:layout_width="match_parent" 
     android:layout_height="60dp" 
     android:layout_alignParentTop="true" 
     android:layout_toEndOf="@+id/txt_item_followers_name" 
     android:background="@color/red_400" 
     android:orientation="vertical"> 

     <ImageView 
      android:id="@+id/btn_item_followers_2b_follow" 
      android:layout_width="100dp" 
      android:layout_height="match_parent" 
      android:layout_alignParentEnd="true" 
      android:layout_marginLeft="10dp" 
      android:src="@drawable/follow_buton" /> 
    </LinearLayout> 


</RelativeLayout> 

dentro método getView

@Override 
    public View getView(final int position, View convertView, 
         ViewGroup parent) { 
     View view = convertView; 
     if (convertView == null) 
      view = inflater.inflate(R.layout.deneme, null); 

     final Followers2 myObj = myList.get(position); 
     LinearLayout linear_one = (LinearLayout) view.findViewById(R.id.linear_one); // HERE WE DOMUNİCATE IT 
     linear_one.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(parentActivity, "One Two", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     TextView name = (TextView) view.findViewById(R.id.txt_item_followers_name); 
     TextView mark = (TextView) view.findViewById(R.id.txt_item_followers_mark); 
     final ImageView btn_follow = (ImageView) view.findViewById(R.id.btn_item_followers_2b_follow); 
     name.setText(myObj.getName()); 
     mark.setText(myObj.getScore()); 
     /* if (myObj.isFollow() == true) { 
      btn_follow.setImageResource(R.drawable.following_buton); 
     } else { 
      btn_follow.setImageResource(R.drawable.follow_buton); 
     } 

     btn_follow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Followers2 myObj = myList.get(position); 
       if (myObj.isFollow() == true) { 
        btn_follow.setImageResource(R.drawable.following_buton); 
       } else { 
        btn_follow.setImageResource(R.drawable.follow_buton); 
       } 
      } 
     });*/ 

     return view; 
    }