PDA

Ver la Versión Completa : Custom Views y Adapters


yerayvg
01/09/13, 13:48:02
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

kriogeN
01/09/13, 13:58:37
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.

tompad28
01/09/13, 14:19:18
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.

yerayvg
01/09/13, 15:47:12
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.

rafaxplayer
01/09/13, 16:14:01
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.

yerayvg
02/09/13, 18:33:55
No consigo aclarar el tema. He encontrado este ejemplo http://www.vogella.com/articles/AndroidCustomViews/article.html#compoundcontrols

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.

yerayvg
09/09/13, 19:35:49
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:


me cree un Coumpound Layout, en lugar de una vista.
public class miLayout extends LinearLayout
{
....
}
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:

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:

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.L AYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.MILAYOUT, this);
mTextView = (TextView)findViewById(R.id.textView1);

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:

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.

miLayout iPL = new miLayout(_context,idColor, title,idImage);
iPL.setLayoutParams(new GridView.LayoutParams(......));

Por último en la Activity donde tenemos el GridView, en el método onCreate(...), instanciamos nuestro Adaptador de nuestros Counpound Layout:

GridView migrdView = (GridView) findViewById(R.id.MI_LAYOUT_XML_MAIN);
migrdView.setAdapter(new miAdapter(.....));