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

Respuesta
 
Herramientas
  #1  
Viejo 01/09/13, 13:48:02
Array

[xs_avatar]
yerayvg yerayvg no está en línea
Usuario novato en la web
 
Fecha de registro: sep 2013
Mensajes: 11
Tu operador: Movistar

Custom Views y Adapters

Buenos días a todos.

A ver si me pueden guiar/ayudar. Estoy empezando con android desde hacer relativamente poco, y tras leerme y seguir la inicializacion del portal oficial de android developers, he empezado a desarrollar una pequeña aplicación.

La idea es tener una pantalla en portrait, con una lista de elementos cuadrados seleccionables. Para ello cree una Avtivity cuyo layout es un GridView de 2 columnas. Cada item que queiro mostrar debe tener un fondo de color solido, un texto y una imagen/icono asociado. Por este motivo me cree una CustomView (siguiendo más o menos lo que aquí se dice http : //developer.android.com/training/custom-views/index.html). cree el res/values/item.xml con los declare-styleable.

El problema viene cuando intento generar un conjunto de mi CustomView para rellenar mi GridView en mi Avtivity principal, pues no se como meterlos programaticamente ya que el constructor de la CustomView nequiere un attributeSet con los atributos que defini en res/values/item.xml.

Tampoco sé si me estoy complicando la vida y esto se debería hacer de otra forma, o si no es necesario crear una vista... no sé.

Alguien me puede ayudar?? muchas gracias
Responder Con Cita


  #2  
Viejo 01/09/13, 13:58:37
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Lo más sencillo es inflar el Layout que te interesa en cada uno de los items del GridView en el método getView del Adapter. No necesitas crear una clase explícita para eso.

Y en el caso de necesitar que los items sean de tipo CustomView por narices, siempre puedes crear un nuevo Layout que contenga a un CustomView, y ese es el Layout que inflas en el getView.
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 01/09/13, 14:19:18
Array

[xs_avatar]
tompad28 tompad28 no está en línea
Miembro del foro
 
Fecha de registro: ago 2011
Mensajes: 128
Modelo de smartphone: Packard Bell Liberty Tab
Tu operador: Simyo
 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Lo más sencillo es inflar el Layout que te interesa en cada uno de los items del GridView en el método getView del Adapter. No necesitas crear una clase explícita para eso.

Y en el caso de necesitar que los items sean de tipo CustomView por narices, siempre puedes crear un nuevo Layout que contenga a un CustomView, y ese es el Layout que inflas en el getView.
Como bien comenta kriogen, lo qure dices es sencillo sin utilizar custom views, aunque si lo vas a reutilizar no está de más. El Layout puedes crearlo inflando en el constructor de la nueva clase (mira la etiqueta merge para optimizar el uso de vistas) o programáticamente extendiendo de un layout y añadiendo elementos con addView, como mejor te venga.
__________________
Aprende a desarrollar tus aplicaciones Android en LiME Creative Labs
Tutoriales paso a paso para que consigas hacer Apps de la mejor calidad.
Responder Con Cita
Gracias de parte de:
  #4  
Viejo 01/09/13, 15:47:12
Array

[xs_avatar]
yerayvg yerayvg no está en línea
Usuario novato en la web
 
Fecha de registro: sep 2013
Mensajes: 11
Tu operador: Movistar

umm.. estoy un poco verde en todo esto.. Pero bueno investigaré un poco sobre el inflate y las diferencias entre usar un layout y un CustomView. Yo estoy casi convencido que necesitaria un CustomView.. por que cada item va a ser diferente al resto, además de que será el usuario quien los vaya añadiendo dinamicamente (no es un grid fijo, es decir, cada cuenta de usuario tendrá un número de items diferente y disitntos entre si). Por lo tanto si no me equivoco ... inflate un layout... no lo puedo configurar no? o no sabria como.

Me pondre a mirar luego a ver si aclaro algo mas..Estoy un poco perdido con esto.
Responder Con Cita
  #5  
Viejo 01/09/13, 16:14:01
Array

[xs_avatar]
rafaxplayer rafaxplayer no está en línea
Miembro del foro
 
Fecha de registro: jun 2013
Localización: en la barcelona media
Mensajes: 224
Modelo de smartphone: LG-E610
Tu operador: Orange
Fíjate en los tutoriales de inet , en todos los que llenan customlistviews o gridviews se utilizan clases adapter y en su método getview usan inflater para inflar el customview(layout que tu diseñes) así como modificar propiedades de sus elementos, todo para cada item.
Responder Con Cita
Gracias de parte de:
  #6  
Viejo 02/09/13, 18:33:55
Array

[xs_avatar]
yerayvg yerayvg no está en línea
Usuario novato en la web
 
Fecha de registro: sep 2013
Mensajes: 11
Tu operador: Movistar

No consigo aclarar el tema. He encontrado este ejemplo http://www.vogella.com/articles/Andr...mpoundcontrols

Tras corregir varios errores en los espacios de nombres, he intentado arrancarlo, pero la aplicación se cierra inesperadamente, así que no sé si la idea es la correcta o el fallo se debe a otro motivo.

He intentado encontrar algún ejemplo, pero no consigo ninguno lo suficientemente claro y simple.
¿Si conocen algún ejemplo/tutorial que funcione me lo podrían pasar?

Muchas gracias por las contestas.
Responder Con Cita
  #7  
Viejo 09/09/13, 19:35:49
Array

[xs_avatar]
yerayvg yerayvg no está en línea
Usuario novato en la web
 
Fecha de registro: sep 2013
Mensajes: 11
Tu operador: Movistar

Finalmente lo conseguí después de todo, así que voy a explicar la solución por si hay alguien que se topa con el problema:
  1. me cree un Coumpound Layout, en lugar de una vista.
    Código:
    public class miLayout extends LinearLayout
    {
    ....
    }
  2. ahora tenemos 2 opciones, o crear el diseño del Layout dinámicamente, o crearlo a partir de un XML. Si lo creamos dinámicamente en el constructor de nuestro Coumpoind Layout (miLayout), instanciamos todos aquellos controles que qeuremos añadir y utilizamos el método addView(). Por ejemplo:
    Código:
    TextView tv = new TextView(context);
    tv.setText(_title);
    addView(tv, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    En cambio si lo que queremos es utilizar un XML que nos hemos creado, el método a utilizar es Inflater.Inflate(...), utilizando findViewById para trabajar con los controles del layout:
    Código:
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.MILAYOUT, this);
    mTextView = (TextView)findViewById(R.id.textView1);
  3. En mi caso quería cargar un gridLayout donde cada item era una instancia de mi Coumpound Layout, así que necesitamos crear una nueva clase que sea un Adaptar, de forma que se encargue componer el grid final:
    Código:
    public class miAdapter extends BaseAdapter {
    ...
    }
    Hay que sobreescribir varios métodos de la clase base, pero el más importante es getView(...), donde instanciaremos nuestra Coumpound Layout, llamando al constructor para inicializarla, y además podremos definir otros parámetros del Layout. AL siguiente ejemplo de código no hacerle mucho caso, solo hay que qeudarse con la idea.
    Código:
    miLayout iPL =  new miLayout(_context,idColor, title,idImage);
    iPL.setLayoutParams(new GridView.LayoutParams(......));
  4. Por último en la Activity donde tenemos el GridView, en el método onCreate(...), instanciamos nuestro Adaptador de nuestros Counpound Layout:
    Código:
    GridView migrdView = (GridView) findViewById(R.id.MI_LAYOUT_XML_MAIN);
    migrdView.setAdapter(new miAdapter(.....));
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 20:55:17 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /