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.

Teepusink
fuente

Respuestas:

182

En su vista de lista, use setOnItemClickListener

David Hedlund
fuente
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
    */  
  }
});
Aditya Mehta
fuente
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

Vijay C
fuente
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.

Dimitar Dimitrov
fuente
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
}
Amio.io
fuente
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();
    }
});
Shudy
fuente
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í

webmaster bourax
fuente
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.
}

});
Amey Haldankar
fuente
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()

 }
Allen
fuente