![]() |
|
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Seleccionar un elemento
Hola, tengo una lista (un LinearLayout), que utilizo para poner un listado de libros con su autor, la clase la defino con:
public class Libro { private String Titulo = ""; private String Autor = ""; public String getTitulo() { return Titulo; } public String getAutor() { return Autor; } public void setTitulo(String titulo) { Titulo = titulo; } public void setAutor(String autor) { Autor = autor; } } La coloco con: final ListView lv; lv = (ListView)findViewById(R.id.list); setListAdapter(new LibroAdapter(this, R.layout.lista_item, Libros)); y hasta aquí todo va bien. El problema es que quiero obtener el campo "Titulo" del elemento seleccionado, y esto no logro hacerlo, simplemente el programa se rompe al poner: lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // que pongo aquí? } }); Entonces ¿porque se rompe el problema con este ultimo trozo de código?, ¿que tendría que poner en su lugar?, y ¿como hago para obtener el "Titulo" del elemento seleccionado? |
|
|
|
#2
|
||||
|
||||
|
Pero donde quieres que se muestre la información en un activity diferente o en la misma activity, porque obtener los datos es muy fácil:
Código:
libros.get(position).getAutor(); |
|
#3
|
||||
|
||||
|
Pues no me funciona, nada más poner lo que me has dicho me aparece subrayado la palabra "libros".
Realmente el código anterior no es mio, es de la web: http://blog.findemor.es/2011/02/como...ndroid-guia-4 si pudieras hecharle una miradita a la aplicación completa sería ideal. Yo quería modificarlo para poder seleccionar un elemento y enviarle a otra activity el titulo del libro seleccionado. Pero no lo consigo... como ya dije, simplemento poniendo: lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // que pongo aquí? } }); se me interrumpe inesperadamente la aplicación. Por cierto, el código anterior lo pongo dentro del: public void onCreate(Bundle savedInstanceState) Hay que ponerlo ahí, ¿no? P.D.: Acabo de darme cuenta que el codigo que he puesto es confuso, fruto de modificaciones y más modificaciones del código origial, así que vuelto a empezar partiendo del código original de http://blog.findemor.es/2011/02/como...ndroid-guia-4 pero sigo con el mismo probema, no se como hacer que los elementos de la lista sean seleccionables y obtener el título del libro contenido en el item seleccionado. Última edición por Capitan Kirk Día 31/03/12 a las 18:04:04 |
|
#4
|
||||
|
||||
|
Mira yo tengo un problema parecido al tuyo, tengo un "listView" y para seleccionar los "Item" utilizo un "switch" y cada "case" es una item, lo que fallo es que solo se me abre con el primer "case" y no se mostrar una imagen distinta para cada "item" en una misma "activity". te dejo mi codigo por si te sirve.
package com.mauristudio.LaVerdad; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; public class LaVerdadDeEllos extends ListActivity{ String curiosidadesEllos[] = { "Curiosidad de Ella 0","Curiosidad de Ella 1", "Curiosidad de Ella 2", "Curiosidad de Ella 3", "Curiosidad de Ella 4", "Curiosidad de Ella 5", "Curiosidad de Ella 6", "Curiosidad de Ella 7", "Curiosidad de Ella 8", "Curiosidad de Ella 9", "Curiosidad de Ella 10", "Curiosidad de Ella 11" }; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, curiosidadesEllos)); } @Override protected void onListItemClick(ListView list, View view, int position, long id){ super.onListItemClick(list, view, position, id); switch (position) { case 0: Intent Vinyeta0 = new Intent(LaVerdadDeEllos.this, MostrarVinyetas.class); this.startActivity(Vinyeta0); break; /*case 1: Intent Vinyeta1 = new Intent(LaVerdadDeEllos.this, MostrarVinyetas.class); this.startActivity(Vinyeta1); break; case 2: Intent Vinyeta2 = new Intent(LaVerdadDeEllos.this, MostrarVinyetas.class); this.startActivity(Vinyeta2); break; case 3: Intent Vinyeta3 = new Intent(LaVerdadDeEllos.this, MostrarVinyetas.class); this.startActivity(Vinyeta3); break; * //Tengo comentado todos los case menos el primero porque si no la aplicacion me da FC } } } |
|
#5
|
||||
|
||||
|
Hola Maurikius1983, no veo el fallo en tu código, pero si solo usas un "<TextView>" en cada linea de tu "listView"te sugiero que mires esta web: http://androideity.com/2011/08/27/co...ndroid-listas ahi tienes un código que funciona perfectamente.
Sin embargo si a ese código le añado un segundo "<TextView>" o un "<ImageView>" da error inmediatamente, a ver si alguien nos puede ayudar. |
|
#6
|
||||
|
||||
|
¿Qué quiere decir que el programa se rompe? ¿Te da excepción? ¿Qué excepción te da?
Partiendo de que LibroAdapter esté correcta, y debe estarlo si los elementos te los muestra, no veo ningún fallo en el onItemClickListener. |
|
#7
|
||||
|
||||
|
Kriogen, cuando digo se rompe quiero decir que me sale en el emulador el mensajito de que se ha cerrado inesperadamente.
Como dije más arriba puede ser culpa mia, ya que he modificado el código muchas veces, por eso lo he borrado y he recuperado el código original de http://blog.findemor.es/2011/02/como...ndroid-guia-4, podrias echarle una miradita, por favor?, el codigo principal lo pongo a continuación, ¿puedes decirme ahi como harías para seleccionar un elemento? me refiero a donde y como pondrias lo del "setOnItemClickListene" y como obtengo el campo título del elemento seleccionado. --------------------------------------------------------------------------------------------- package com.example.tolkienlibrary; import java.util.ArrayList; import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class ControladorLista extends ListActivity { public class Libro { private String Titulo = ""; private String Autor = ""; public String getTitulo() { return Titulo; } public String getAutor() { return Autor; } public void setTitulo(String titulo) { Titulo = titulo; } public void setAutor(String autor) { Autor = autor; } } private class LibroAdapter extends ArrayAdapter<Libro> { private ArrayList<Libro> items; public LibroAdapter(Context context, int textViewResourceId, ArrayList<Libro> items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.lista_item, null); } Libro libro = items.get(position); if (libro != null) { TextView ttitulo = (TextView) v.findViewById(R.id.titulo); TextView tautor = (TextView) v.findViewById(R.id.autor); if (ttitulo != null) { ttitulo.setText(libro.getTitulo()); } if (tautor != null) { tautor.setText(libro.getAutor()); } } return v; } } /** Called when the activity is first created. * @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Obtenemos la lista de Libros ArrayList<Libro> Libros = getItems(); // Entregamos la lista de Libros al adaptador de la lista en el Layout Lista.xml setListAdapter(new LibroAdapter(this, R.layout.lista_item, Libros)); } /* * Obtiene una lista de libros * * @returns ArrayList<Libro> libros * public ArrayList<Libro> getItems() { ArrayList<Libro> MiLista = new ArrayList<Libro>(); // Creamos los objetos Libro Libro libro1 = new Libro(); libro1.setTitulo("El Silmarillion"); libro1.setAutor("J.R.R. Tolkien"); Libro libro2 = new Libro(); libro2.setTitulo("El Señor de los Anillos"); libro2.setAutor("J.R.R. Tolkien"); Libro libro3 = new Libro(); libro3.setTitulo("Los propios dioses"); libro3.setAutor("Isaac Asimov"); // Añadimos los libros a la lista MiLista.add(libro1); MiLista.add(libro2); MiLista.add(libro3); return MiLista; } } Última edición por Capitan Kirk Día 01/04/12 a las 12:52:30 |
|
#8
|
||||
|
||||
|
Yo no he usado nunca ListActivity, prefiero programar el ListView a pelo ya que me deja más libertad para configurar la pantalla con más controles y poner el ListView donde yo quiera.
Pero debería ser algo más o menos así justo al final del OnCreate (partiendo de tu código inicial): getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // que pongo aquí? } }); Y en el que pongo aquí?, pues lo que quieras, pon un Toast que te muestre el position que has pulsado como punto de partida, para comprobar que todo está funcionando bien. |
|
#9
|
||||
|
||||
|
Pues esto se asemeja ya a lo que quiero. Ya he conseguido que el primer case me muestre una imagen y gracias a vuestros consejos, ahora edito el listView a mi antojo y lo puedo poner mas acorde con la app. lo unico que nesecitaria ahora es poder cambiar la imagen, que al pulsar otro item de la lista me muestre otra imagen. Lo podria hacer creando una activity por imagen pero entiendo que otro metodo abrá ya que esto seria muy poco profesional.
Codigo Actividad con listView. public class LaVerdadDeEllos extends Activity{ ListView lv; String curiosidadesEllos[] = { "Curiosidad de El 1", "Curiosidad de El 2", "Curiosidad de El 3", "Curiosidad de El 4", "Curiosidad de El 5", "Curiosidad de El 6", "Curiosidad de El 7", "Curiosidad de El 8", "Curiosidad de El 9", "Curiosidad de El 10", "Curiosidad de El 11", "Curiosidad de El 12" }; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.ellos); lv = (ListView)findViewById(R.id.list_el); lv.setAdapter(new ArrayAdapter(this,R.layout.list_style,curiosidades Ellos)); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view,int position, long id) { switch (position) { case 0: Intent imagen1 = new Intent(LaVerdadDeEllos.this, MostrarImgEl.class); startActivity(imagen1); break; } } }); } } ///////////////////////////////////////////////////////////////////////////////////////////// codigo donde mostrar img public class MostrarImgEl extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mostrar_img_el); ImageView image1 = (ImageView) findViewById(R.id.img_el); } } |
|
#10
|
||||
|
||||
|
Lo que quieres es que al pulsar un item te muestre la imagen en una nueva activity en grande, ¿no?
Manda la imagen que has pulsado en un Bundle. |
|
#11
|
||||
|
||||
|
Justamente lo mismo, es decir ¿con un bundle puedo modificar la imagen que se ve en la otra actividad o mostraria una imagen por delante ( como los z-index)?.
-Voy a buscar info sobre eso. Oye muchas gracias. mi idea es esa que al pulsar un item me muestre una imagen a pantalla completa, la primera idea es en una actividad nueva que sea la que muestre las imagenes no se si hay otra forma de hacerlo, -Van a ir viñetas con curiosidades de hombres y mujeres. |
|
#12
|
||||
|
||||
|
Puedes hacer 2 cosas:
1) Mandar la imagen que hay que mostrar en un Bundle y en el OnStart de la activity establecer la imagen. 2) Puedes tener la imagen en el mismo Activity que el ListView, cuando pulsas un elemento ocultas el ListView y muestras la imagen, haciendo esto también tendrías que sobreescribir la pulsación del Back para que al pulsarlo hiciese la operación inversa. De los 2 métodos el más elegante es el primero. |
|
#13
|
||||
|
||||
|
Si me dices que el primero ese haré, en resumidas cuentas en la opción 1, lo que voy a hacer es utilizar la actividad para mostrar como contenedor y le iré enviando imágenes para mostrar. a través del método onStar(). Que es exactamente lo que yo quería desde un principio.
Pues muchas gracias maestro a lo largo de esta semana iré avanzando y ya te informo de como va el tema. |
|
#14
|
||||
|
||||
|
siiiiiiiiiiiii, funciona, gracias a la ayuda de kriogeN, lo de seleccionar un elemento me ha quedado así (con un toast), modifico el código que pongo en el mensaje número 7 de este hilo y quedaría así:
------------------------------------------------------------------------------------------------------------- package com.example.tolkienlibrary; import java.util.ArrayList; import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.TextView; import android.widget.Toast; public class ControladorLista extends ListActivity { public class Libro { private String Titulo = ""; private String Autor = ""; public String getTitulo() { return Titulo; } public String getAutor() { return Autor; } public void setTitulo(String titulo) { Titulo = titulo; } public void setAutor(String autor) { Autor = autor; } } private class LibroAdapter extends ArrayAdapter<Libro> { private ArrayList<Libro> items; public LibroAdapter(Context context, int textViewResourceId, ArrayList<Libro> items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.lista_item, null); } Libro libro = items.get(position); if (libro != null) { TextView ttitulo = (TextView) v.findViewById(R.id.titulo); TextView tautor = (TextView) v.findViewById(R.id.autor); if (ttitulo != null) { ttitulo.setText(libro.getTitulo()); } if (tautor != null) { tautor.setText(libro.getAutor()); } } return v; } } final public static String MyKey = "mikey"; /** Called when the activity is first created. * @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Obtenemos la lista de Libros final ArrayList<Libro> Libros = getItems(); // Entregamos la lista de Libros al adaptador de la lista en el Layout Lista.xml setListAdapter(new LibroAdapter(this, R.layout.lista_item, Libros)); getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast toast = Toast.makeText(getApplicationContext(), Libros.get(position).getTitulo(), Toast.LENGTH_SHORT); toast.show(); } }); } /* * Obtiene una lista de libros * * @returns ArrayList<Libro> libros * public ArrayList<Libro> getItems() { ArrayList<Libro> MiLista = new ArrayList<Libro>(); // Creamos los objetos Libro Libro libro1 = new Libro(); libro1.setTitulo("El Silmarillion"); libro1.setAutor("J.R.R. Tolkien"); Libro libro2 = new Libro(); libro2.setTitulo("El Señor de los Anillos"); libro2.setAutor("J.R.R. Tolkien"); Libro libro3 = new Libro(); libro3.setTitulo("Los propios dioses"); libro3.setAutor("Isaac Asimov"); // Añadimos los libros a la lista MiLista.add(libro1); MiLista.add(libro2); MiLista.add(libro3); return MiLista; } } ---------------------------------------------------------------------------------------------- Última edición por Capitan Kirk Día 02/04/12 a las 12:21:44 |
|
#15
|
||||
|
||||
|
Suponiendo que el código anterior esté dentro del onCreate, y a continuación de ArrayList<Libro> libros= getItems()
Tienes 2 opciones: 1) Declarar a ArrayList<Libro> libros como global, y así en el código dentro del onCreate simplemenente tendrías: libros = getItems(); 2) Declarar a ArrayList<Libro> libros como final dentro del onCreate, y así tendrías esto: final ArrayList<Libro> libros = getItems(); |
|
#16
|
||||
|
||||
|
Hola Maurikius1983, he conseguido modificar el codigo de la aplicación:
http://blog.findemor.es/2011/02/como...ndroid-guia-4 ahora en cada item podemos poner la foto que queramos y 2 textos, y además los items son clickeables y le enviamos la variable "titulo" a la activity siguiente, ¿es lo que estabas buscando, verdad? te paso el código, el resto de achivos los puedes pillar de la web que te doy ahi arriba y las fotos (chiquitinas unos 100x100 pixeles) las pones en la carpeta drawable (en mi caso se llaman perro y gato). Mira a ver si te vale. ---------------------------------------------------------------------------------------------------- package com.example.tolkienlibrary; import java.util.ArrayList; import android.app.ListActivity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; public class ControladorLista extends ListActivity { public class Libro { private String Titulo = ""; private String Autor = ""; private String Imagen = ""; public String getTitulo() { return Titulo; } public String getAutor() { return Autor; } public String getImagen() { return Imagen; } public void setTitulo(String titulo) { Titulo = titulo; } public void setAutor(String autor) { Autor = autor; } public void setImagen(String imagen) { Imagen = imagen; } } private class LibroAdapter extends ArrayAdapter<Libro> { private ArrayList<Libro> items; public LibroAdapter(Context context, int textViewResourceId, ArrayList<Libro> items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.lista_item, null); } Libro libro = items.get(position); if (libro != null) { TextView ttitulo = (TextView) v.findViewById(R.id.titulo); TextView tautor = (TextView) v.findViewById(R.id.autor); ImageView timagen = (ImageView) v.findViewById(R.id.icono); if (ttitulo != null) { ttitulo.setText(libro.getTitulo()); } if (tautor != null) { tautor.setText(libro.getAutor()); } if (timagen != null) { int res_imagen = ControladorLista.this.getResources().getIdentifier ("drawable/"+libro.getImagen(), null, ControladorLista.this.getPackageName()); timagen.setImageResource(res_imagen); } } return v; } } /** Called when the activity is first created. * @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Obtenemos la lista de Libros final ArrayList<Libro> Libros = getItems(); // Entregamos la lista de Libros al adaptador de la lista en el Layout Lista.xml setListAdapter(new LibroAdapter(this, R.layout.lista_item, Libros)); getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(view.getContext(),sonido.class); Bundle bundle = new Bundle(); bundle.putString("animal", Libros.get(position).getTitulo()); intent.putExtras(bundle); startActivity(intent); } }); } /* * Obtiene una lista de libros * * @returns ArrayList<Libro> libros * public ArrayList<Libro> getItems() { ArrayList<Libro> MiLista = new ArrayList<Libro>(); // Creamos los objetos Libro Libro libro1 = new Libro(); libro1.setTitulo("Perro"); libro1.setAutor("guau guau guau"); libro1.setImagen("perro"); Libro libro2 = new Libro(); libro2.setTitulo("Gato"); libro2.setAutor("miau miau miau"); libro2.setImagen("gato"); // Añadimos los libros a la lista MiLista.add(libro1); MiLista.add(libro2); return MiLista; } } |
|
#17
|
||||
|
||||
|
Aunque el código anterior funciona, lo hace para un ListActivity, y me pregunto que tendría que cambiar para que funcione para una Activity normal
Había visto esta respuesta, y me pregunto como hacer el listview a pelo que cada item tenga una imagen y un texto, para que funcione en una activity. |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
| Herramientas | |
|
|
Hora actual: 21:41:02 (GMT +1)
HTCMania: líderes desde el 2007






