Cómo manejar el clic ListView en Android


141

¿Cómo escucho un evento de clic en un ListView?

Esto es lo que tengo ahora

ListView list = (ListView)findViewById(R.id.ListView01);  
...  
list.setAdapter(adapter);  

Cuando hago lo siguiente

list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {  
   public void onItemSelected(AdapterView parentView, View childView, 
                                                         int position, long id) 
   {  
       setDetail(position);  
   }

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

Eso no parece hacer nada al hacer clic.
Y todos esos códigos viven dentro de una clase que extiende Actividad.

Respuestas:


182

En su vista de lista, use setOnItemClickListener


Gracias david Geezzz, probé setOnClickListener y setOnItemSelectedListener pero no pude leer setOnItemClickListener. Gracias, Tee
teepusink

hice lo mismo que teepusink: D
Shereef Marzouk

¿Cómo se envían los datos a esa vista detallada? (Al igual que YouTube haciendo clic en un video)
Sauron

Primero, la clase debe implementar el escucha de clics: implementa OnItemClickListener Luego establezca un escucha en ListView yourList.setOnItemclickListener (this); Y finalmente, cree el método clic: @Override public void onItemClick (AdapterView <?> Parent, View view, int position, long id) {Toast.makeText (MainActivity.this, "Ha hecho clic en" + países [+ posición], Toast.LENGTH_SHORT) .show (); }
bourax webmaster

88

Supongamos que el objeto ListView es lv, haga lo siguiente:

lv.setClickable(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

    Object o = lv.getItemAtPosition(position);
    /* write you handling code like...
    String st = "sdcard/";
    File f = new File(st+o.toString());
    // do whatever u want to do with 'f' File object
    */  
  }
});

1
lvNo es accesible por dentro onItemClick. ¿Cuál es una buena manera de evitar eso?
Shinjin

1
@shinjin Hazlo final. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn

Manera limpia:Object o = ((ListView)arg0).getItemAtPosition(position);
JimmyB

Aquí está el enlace a la documentación: developer.android.com/reference/android/widget/…
trinity420

42

Debe configurar la vista inflada "Clickable" y "capaz de escuchar los eventos de clic" en el método getView () de su clase de adaptador.

convertView = mInflater.inflate(R.layout.list_item_text, null);
convertView.setClickable(true);
convertView.setOnClickListener(myClickListener);

y declare el oyente de clics en su ListActivity de la siguiente manera,

public OnClickListener myClickListener = new OnClickListener() {
public void onClick(View v) {
                 //code to be written to handle the click event
    }
};

Esto es válido solo cuando personaliza el Adaptador al extender BaseAdapter.

Consulte ANDROID_SDK / samples / ApiDemos / src / com / example / android / apis / view / List14.java para obtener más detalles


gracias Vijay me enfrento a un problema de clic en la vista de
inflado que

Pero esto no determina en qué elemento se está haciendo clic, lo que lo hace más o menos inútil para una lista. ¿Correcto?
avestruz de granja

puede configurar la etiqueta para convertirView y verificar lo mismo en onClick .. usando la etiqueta en qué elemento se hace clic se puede identificar ...
Vijay C

He encontrado una solución más elegante que una etiqueta en su adaptador, almacene una referencia setOnClickListener y llame al método onClick (View v). entonces la actividad puede recibir el evento con el puesto.
jocelyn

Su método onClick está mal. Debe ser onItemClick (AdapterView <?> Parent, View view, int position, long id)
IgorGanapolsky

17

Las dos respuestas antes de la mía son correctas: puedes usarlas OnItemClickListener.

Es bueno tener en cuenta que la diferencia entre OnItemClickListenery OnItemSelectedListener, aunque suena sutil, es de hecho significativa, ya que la selección de elementos y el enfoque están relacionados con el modo táctil de su AdapterView.

Por defecto, en modo táctil, no hay selección ni foco. Puede consultar aquí para obtener más información sobre el tema.


8

Esta solución es realmente minimalista y no estropea su código.

En su list_item.xml (NOT listView!) Asigne el atributo android: on Haga clic de esta manera:

<RelativeLayout android:onClick="onClickDoSomething">

y luego en tu actividad llama a este método:

public void onClickDoSomething(View view) {
   // the view is the line you have clicked on
}

buena solución, pero no hay forma de hacer clic en la posición del artículo
Bilal Şimşek

@ BilalŞimşek Durante mucho tiempo he estado fuera de Android, pero si viewpuede tener algunos metadatos, podría ser la forma de obtener la posición.
Amio.io

6

Tienes que usar setOnItemClickListeneralguien dijo.
El código debería ser así:

listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // When clicked, show a toast with the TextView text or do whatever you need.
        Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
    }
});

5

Primero, la clase debe implementar el escucha de clics:

implements OnItemClickListener

Luego configure un oyente para ListView

yourList.setOnItemclickListener(this);

Y finalmente, crea el método clic:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +countries[+ position], Toast.LENGTH_SHORT).show();
}

puedes echar un vistazo y descargar el código aquí


3

Use setOnItemClickListener () api en su actividad. A continuación se muestra la muestra.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

@Override
public void onItemClick(AdapterView<> parent, View view, int position, long id)
{
     // your code here.
}

});

1

En Kotlin, agregue un oyente a su lista Ver tan simple como java

your_listview.setOnItemClickListener { parent, view, position, id ->   

    Toast.makeText(this, position, Toast.LENGTH_SHORT).show()

 }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.