Android: onListItemClick en la actividad
La anterior vez que hice una pregunta aquí aprendí mucho así que supongo que vale la pena intentarlo de nuevo.
Estoy usando la lista perezosa de Fedor desde este enlace: Carga perezosa de imágenes en ListView
- Obtener diálogo para mostrar una vez
- Realización de solicitudes POST autenticadas con Spring RestTemplate para Android
- El desbordamiento de barras de acción no se muestra
- ¿Cómo determinar en qué plataforma se ejecuta la aplicación actual en LibGDX?
- Android no es compatible con Java v7 +, así que ¿debo usar múltiples capturas o una captura con cheques de instanceof?
Está funcionando como un encanto. PERO, Fedor está haciendo que su clase principal extienda Activity
lugar de ListActivity
. Debido a esto, ya no puedo utilizar un listItemClick oyente. Eclipse declara algunos errores alrededor de onListItemClick()
. Funciona cuando doy la vuelta
@Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // Intent launcher here }
dentro
protected void onListItemClick(ListView l, View v, int position, long id) { // Intent launcher here }
Pero el lanzador de intenciones no funciona. Tampoco una notificación tostada.
Cuando cambio la Activity
en una ListActivity
, Eclipse no se tambalea, pero mi emulador me da una fuerza cercana.
Como lo consigo
- O bien
onListItemClick()
haga clic en la actividad (preferible) - ¿O puedo transformar el código en una
ListActivity
sin fuerza cerca?
Muchas gracias por adelantado.
- Cómo corregir este error "Límite de sobrecarga de GC excedido en Eclipse"
- ¿Cómo obtener registros de otras aplicaciones?
- Custom ViewPager para permitir que el control GoogleMap infantil se desplace horizontalmente
- Cómo cambiar una RealmList a RealmResult?
- GestureDetector en libgdx
- Android Studio - con Junit 4.12 "!!! JUnit versión 3.8 o posterior esperado: "
- ¿Cómo usar mkdirs de manera segura en Java?
- ¿Cómo calcular la posición en un círculo con un cierto ángulo?
Estoy escribiendo mi respuesta como:
1) el código de @Falmarri necesita algunas actualizaciones
2) Mi edición sugerida fue totalmente rechazada XD
3) Stackoverflow no me está permitiendo escribir un comentario.
Aquí está el código:
ListView listView = (ListView) findViewById(R.id.my_listview_in_layout); listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id){ //Do stuff //... } });
Referencia: De acuerdo con android.widget.AdapterView.OnItemClickListener , el método público onItemClick () es el método invocado cuando se hace clic en un elemento {en lugar de método desconocido onListItemClick () }
Un listItemClickListener está asociado a un ListView
. Cuando cambió ListActivity
a Activity
, su clase ya no tiene una vista asociada con ella y por lo tanto una clase Activity
no tiene idea de qué hacer con un onListItemClickListener.
Sólo tienes que adjuntar un oyente a tu ListView
:
listview.setOnItemClickListener(new OnItemClickListener(){ @Override protected void onListItemClick(AdapterView<?> parent, View view, int position, long id){ //Do stuff } });
He estado trabajando en esto todo el día y después de hacer mi propio ArrayAdapter
no pude averiguar cómo cambiar las clases en mi lista.
He aquí cómo descubrí cómo hacerlo. Después de que llamé a mi matriz simplemente terminé mi código en ese método haciendo.
ListView lv =getListView(); lv.setOnItemClickListener(this);
Entonces después de todo mi texto puse
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { String item = (String) getListAdapter().getItem(position); if (item.equals("Economy")) { Intent intent = new Intent(packages.this, economy.class); startActivity(intent); } else if (item.equals("Basic")) { Intent intent = new Intent(packages.this, basic.class); startActivity(intent); } else if (item.equals("Professional")) { Intent intent = new Intent(packages.this, professional.class); startActivity(intent); } else if (item.equals("Custom Applications")) { Intent intent = new Intent(packages.this, applications.class); startActivity(intent); } }
Entre logré personalizar completamente mi ListView
con fuentes y fondos personalizados. Estoy seguro de que un montón de tu no te importa. Pero estoy salido y estaba esperando publicando esto que podría ayudar a alguien en el futuro.
Para que una lista no ListActivity
tenga un ListActivity
-clicked-listener para un ListView
, tiene que llamar a setOnItemClickedListener()
en ListView
(puede necesitarlo usando findViewById()
si procede de XML)
En lugar de simplemente ListActivity
onListItemClickListener()
, aquí tendría su invocación Activity
implementar AdapterView.onItemClickedListener()
y pasarla como parámetro a setOnItemClickedListener()
.
(Si lees el código fuente de ListActivity
(lo recomiendo), verás que hace exactamente eso detrás de las escenas creando un objeto de escucha interno que llama a tu onListItemClick()
).
Si está utilizando ListActivity
, quiere hacer algo como esto:
public class YourClass extends ListActivity implements OnItemClickListener{ @Override public void onCreate(Bundle icicle){ super.onCreate(icicle); setContentView(R.layout.your_layout); getListView().setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // your stuff here } }
Esta no es la única manera de establecer un OnItemClickListener
. Mira otras respuestas. Esta es la forma en que me gusta hacerlo, ya que es más clara y fácil de leer.
FE.java
package com.example.rfe; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class FE extends ListActivity { public List<String> d = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.file); d = new ArrayList<String>(); Scanner in = null; File f = new File("/sdcard/input.txt"); try { in = new Scanner(new FileReader(f)); while(in.hasNext()==true) { d.add(in.nextLine()); } }catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ArrayAdapter<String> fileList = new ArrayAdapter<String>(this, R.layout.row, d); setListAdapter(fileList); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { String selection = l.getItemAtPosition(position).toString(); Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); super.onListItemClick(l, v, position, id); } }
Supongamos que tiene el origen de datos Fruto contiene pocas cadenas. Puede definir el onCreate()
siguiente manera:
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_fruit, FRUITS)); // context is this, style is list_fruit, Context, ,data_binding to FRUITs
Y luego escribe el onListItemClick()
como sigue:
protected void onListItemClick(ListView parent, View v, int position, long id) { Toast.makeText(this, " You selected " + FRUITS[position], Toast.LENGTH_SHORT).show(); }
Espero que te funcione 🙂
Simplemente he añadido el siguiente en onCreate()
:
listvview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { setPaymentDetails(); } });
Fuera de onCreate()
agregó setPaymentDetails()
:
protected void setPaymentDetails() { Intent intent = new Intent(this, SetPaymentDetailsActivity.class); startActivity(intent); }