2009-10-05 19 views
19

He implementado un ListView personalizado ampliando LinearLayout para cada fila. Cada fila tiene una pequeña miniatura, un texto y un check box. El list view se implementó correctamente y puedo desplazarme y lanzarlo sin ningún problema.setOnItemClickListener() no funciona en ListView @ Android personalizado

Pero El ListView no parece responder a la setOnItemClickListener() en absoluto, así que tuve que encontrar una solución mediante el establecimiento de detector de clics en el getView() del texto dentro de cada fila que obviamente está creando un problema cuando estoy tratando de reutilizar el adapter. ¿Alguien tiene una solución?

Respuesta

43

probar este
Para ListView,

final ListView list = (ListView) findViewById(R.id.list); 
list.setItemsCanFocus(false); 

Además, asegúrese de que para CheckBox dentro elemento de la lista establece enfocable falsa

android:focusable="false" 
android:focusableInTouchMode="false" 
+0

estoy teniendo el mismo problema, la solución anterior funciona para detectar clics en la fila, pero tengo 2 botones en mi fila ListView personalizado. ¿Cómo puedo saber en qué botón se hizo clic? Gracias – longhairedsi

+0

gracias! ¡Realmente me ayudaste! –

+1

@longhairedsi: agregue el siguiente código en el método getView() button1.setFocusable (false); button2.setFocusable (falso); button1.setFocusableInTouchMode (falso); button2.setFocusableInTouchMode (falso); button1.setOnClickListener (this); button2.setOnClickListener (this); implemente su oyente clic para el botón en su adaptador (o donde lo desee ....) haga clic en oyente para la vista de lista también ..... ahora compruebe que su clic funcionará para ambos ..... listview también en cuanto a los botones también –

0

¿Hizo algún ViewHolder en su clase de adaptador extendido? Si es así, cree una instancia de ese marcador de posición en el setOnItemClickListener() algo puede funcionar así.

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) {   
     View rowView = v; 
     if (rowView == null) { 
      LayoutInflater inflater = this.getLayoutInflater(); 
       // GET INFLATE OF YOUR LAYOUT. 
      rowView = inflater.inflate(R.layout.projectpeopledescrate, null); 
      // CUSTOM ViewHolder Class Created in Adapter. 
// name,title,comment are my components on the same listview clicked item. 
      PPDViewHolder viewHolder = new PPDViewHolder(); 
      viewHolder.name  = (TextView) rowView.findViewById(R.id.ppeopledescrvname); 
      viewHolder.title = (TextView) rowView.findViewById(R.id.ppeopledescrvtime); 
      viewHolder.comment = (TextView) rowView.findViewById(R.id.ppeoplervcomment); 
      viewHolder.hiddenLayout = (RelativeLayout) rowView.findViewById(R.id.hiddenCommentPanel); 
      rowView.setTag(viewHolder); 
     } 
      // ANOTHER object instance to apply new changes. 
     PPDViewHolder holder = (PPDViewHolder) rowView.getTag(); 
// I've setted up visibility over the components. You can set your onClickListener over your buttons. 
     holder.comment.setVisibility(View.GONE); 
     holder.name.setVisibility(View.GONE); 
     holder.title.setVisibility(View.GONE); 
     holder.hiddenLayout.setVisibility(View.VISIBLE); 
     holder.hiddenLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT)); 
     holder.hiddenLayout.bringToFront(); 

    } 

Espero que quieras algo igual. ¡Buena suerte!

11

vieja respuesta: escribí en previous post here

android:focusable="false" 
android:clickable="false" 

no ayudará cuando ImageButton está en vista personalizada .. uno debe utilizar button.setFocusable(false); durante el tiempo de ejecución (a partir de código fuente de Java)

Edit: Hay una solución aún más elegante. Intente agregar android:descendantFocusability="blocksDescendants" en el diseño raíz del elemento list. Eso hará posible onListItem clics y por separado u puede manejar botón o ImageButton clics

0

tengo este código

this.mListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
       Log.v(TAG,"loul"); 
      } 
     }); 

Pero no funcionó

Así que me he puesto un juste onItemSelectedListener bajo y Oo trabajo:

this.mListView.setItemsCanFocus(false); 
this.mListView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
     Log.v(TAG,"loul"); 
    } 
}); 
//listener for nothing but it allow OnItemClickListener to work 
this.mListView.setOnItemSelectedListener(new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 
0

establecer estas propiedades:

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

para todos sus elementos de IU en su archivo list_item.xml.

si esto no se resuelve a su juego de adaptadores:

v.imageView.setFocusable(false); 
    v.imageView.setFocusableInTouchMode(false); 
Cuestiones relacionadas