Inicio Android Interfaz de usuario en Android: Controles de selección (III)

Interfaz de usuario en Android: Controles de selección (III)

por sgoliver

En el artículo anterior ya vimos cómo utilizar los controles de tipo ListView en Android. Sin embargo, acabamos comentando que existía una forma más eficiente de hacer uso de dicho control, de forma que la respuesta de nuestra aplicación fuera más agil y se reduciese el consumo de batería, algo que en plataformas móviles siempre es importante.

Como base para este artículo vamos a utilizar como código que ya escribimos en el artículo anterior, por lo que si has llegado hasta aquí directamente te recomiendo que leas primero el primer post dedicado al control ListView.

Cuando comentamos cómo crear nuestro propio adaptador, extendiendo de ArrayAdapter, para personalizar la forma en que nuestros datos se iban a mostrar en la lista escribimos el siguiente código:

class AdaptadorTitulares extends ArrayAdapter<Titular> {

    public AdaptadorTitulares(Context context, Titular[] datos) {
        super(context, R.layout.listitem_titular, datos);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        View item = inflater.inflate(R.layout.listitem_titular, null);

        TextView lblTitulo = (TextView)item.findViewById(R.id.LblTitulo);
        lblTitulo.setText(datos[position].getTitulo());

        TextView lblSubtitulo = (TextView)item.findViewById(R.id.LblSubTitulo);
        lblSubtitulo.setText(datos[position].getSubtitulo());

        return(item);
    }
}

Centrándonos en la definición del método getView() vimos que la forma normal de proceder consistía en primer lugar en «inflar» nuestro layout XML personalizado para crear todos los objetos correspondientes (con la estructura descrita en el XML) y posteriormente acceder a dichos objetos para modificar sus propiedades. Sin embargo, hay que tener en cuenta que esto se hace todas y cada una de las veces que se necesita mostrar un elemento de la lista en pantalla, se haya mostrado ya o no con anterioridad, ya que Android no «guarda» los elementos de la lista que desaparecen de pantalla (por ejemplo al hacer scroll sobre la lista). El efecto de esto es obvio, dependiendo del tamaño de la lista y sobre todo de la complejidad del layout que hayamos definido esto puede suponer la creación y destrucción de cantidades ingentes de objetos (que puede que ni siquiera nos sean necesarios), es decir, que la acción de inflar un layout XML puede ser bastante costosa, lo que podría aumentar mucho, y sin necesidad, el uso de CPU, de memoria, y de batería.

Para aliviar este problema, Android nos propone un método que permite reutilizar algún layout que ya hayamos inflado con anterioridad y que ya no nos haga falta por algún motivo, por ejemplo porque el elemento correspondiente de la lista ha desaparecido de la pantalla al hacer scroll. De esta forma evitamos todo el trabajo de crear y estructurar todos los objetos asociados al layout, por lo que tan sólo nos quedaría obtener la referencia a ellos mediante findViewById() y modificar sus propiedades.

¿Pero cómo podemos reutilizar estos layouts «obsoletos»? Pues es bien sencillo, siempre que exista algún layout que pueda ser reutilizado éste se va a recibir a través del parámetro convertView del método getView(). De esta forma, en los casos en que éste no sea null podremos obviar el trabajo de inflar el layout. Veamos cómo quedaría el métod getView() tras esta optimización:

public View getView(int position, View convertView, ViewGroup parent)
{
    View item = convertView;

    if(item == null)
    {
        LayoutInflater inflater = context.getLayoutInflater();
        item = inflater.inflate(R.layout.listitem_titular, null);
    }

    TextView lblTitulo = (TextView)item.findViewById(R.id.LblTitulo);
    lblTitulo.setText(datos[position].getTitulo());

    TextView lblSubtitulo = (TextView)item.findViewById(R.id.LblSubTitulo);
    lblSubtitulo.setText(datos[position].getSubtitulo());

    return(item);
}

Si ejecutamos ahora la aplicación podemos comprobar que al hacer scroll sobre la lista todo sigue funcionando con normalidad, con la diferencia de que le estamos ahorrando gran cantidad de trabajo a la CPU.

Pero vamos a ir un poco más allá. Con la optimización que acabamos de implementar conseguimos ahorrarnos el trabajo de inflar el layout definido cada vez que se muestra un nuevo elemento. Pero aún hay otras dos llamadas relativamente costosas que se siguen ejecutando en todas las llamadas. Me refiero a la obtención de la referencia a cada uno de los objetos a modificar mediante el método findViewById(). La búsqueda por ID de un control determinado dentro del árbol de objetos de un layout también puede ser una tarea costosa dependiendo de la complejidad del propio layout. ¿Por qué no aprovechamos que estamos «guardando» un layout anterior para guardar también la referencia a los controles que lo forman de forma que no tengamos que volver a buscarlos? Pues eso es exactamente lo que vamos a hacer mediante lo que suelen llamar patrón ViewHolder. Nuestra clase ViewHolder tan sólo va a contener una referencia a cada uno de los controles que tengamos que manipular de nuestro layout, en nuestro caso las dos etiquetas de texto. Definamos por tanto esta clase de la siguiente forma:

static class ViewHolder {
    TextView titulo;
    TextView subtitulo;
}

La idea será por tanto crear e inicializar el objeto ViewHolder la primera vez que inflemos un elemento de la lista y asociarlo a dicho elemento de forma que posteriormente podamos recuperarlo fácilmente. ¿Pero dónde lo guardamos? Fácil, en Android todos los controles tienen una propiedad llamada Tag (podemos asignarla y recuperarla mediante los métodos setTag() y getTag() respectivamente) que puede contener cualquier tipo de objeto, por lo que resulta ideal para guardar nuestro objeto ViewHolder. De esta forma, cuando el parámetro convertView llegue informado sabremos que también tendremos disponibles las referencias a sus controles hijos a través de la propiedad Tag. Veamos el código modificado de getView() para aprovechar esta nueva optimización:

public View getView(int position, View convertView, ViewGroup parent)
{
    View item = convertView;
    ViewHolder holder;

    if(item == null)
    {
        LayoutInflater inflater = context.getLayoutInflater();
        item = inflater.inflate(R.layout.listitem_titular, null);

        holder = new ViewHolder();
        holder.titulo = (TextView)item.findViewById(R.id.LblTitulo);
        holder.subtitulo = (TextView)item.findViewById(R.id.LblSubTitulo);

        item.setTag(holder);
    }
    else
    {
        holder = (ViewHolder)item.getTag();
    }

    holder.titulo.setText(datos[position].getTitulo());
    holder.subtitulo.setText(datos[position].getSubtitulo());

    return(item);
}

Con estas dos optimizaciones hemos conseguido que la aplicación sea mucho más respetuosa con los recursos del dispositivo de nuestros usuarios, algo que sin duda nos agradecerán.

Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la pagina del curso en GitHub.

También te puede interesar

37 comentarios

Desarrollo en Android | sgoliver.net blog 16/09/2010 - 15:55

[…] Interfaz de usuario en Android: Controles de selección (III) […]

Responder
Dani 19/09/2010 - 22:55

Gracias por tus artículos, me han ayudado mucho.
He implementado tu ejemplo, pero me falta una cosa que no consigo… a ver si me puedes ayudar. Necesito implementar el click en cada item, ya que tengo que mostrar en otra pantalla el detalle del item que selecciono.
¿como puedo hacerlo?

Responder
sgoliver 21/09/2010 - 8:20

Intentaré actualizar el artículo durante el día de hoy para incluir lo que indicas. Saludos.

Responder
Dani 22/09/2010 - 20:35

Ok! gracias, espero la actualización con impaciencia :)

Responder
sgoliver 24/09/2010 - 11:07

He añadido una pequeña reseña a cómo implementar el evento onItemClick en un control ListView en el artículo anterior: http://www.sgoliver.net/blog/?p=1414

Responder
Dani 28/09/2010 - 14:39

Gracias! ya lo he probado, perfecto, genial trabajo!! :)

Una pregunta… yo recojo los datos que muestro a traves de un WebService, que devuelve muchisimos datos (de varios cientos de registros, a mil aproximadamente), esto hace que según el número de registros la cosa se ralentize mucho. En la aplicación de Marquet de Android lo que he visto que hace es una especie de paginación, muestra unos cuantos registros, y cuando haces scroll para ver los siguientes recupera esos… por lo tanto solo está recuperando los datos que necesita, ¿como se puede hacer esto? tienes alguna idea??

Un saludo!

Responder
david 18/04/2011 - 14:23

Hola,

Muchas gracias por los tutoriales tan fabulosos que haces. Me gustaria saber como se puede implementar en una listView un togglebutton en cada fila para que se actualice cuando subes y bajas la lista. Estoy buscando informacion pero no hay forma.

Gracias por todo y saludos,

Responder
jsaludas 19/04/2011 - 21:08

¡¡Genial aporte!!
Muchas gracias.

Responder
Seni 10/06/2011 - 14:32

Muchas gracias por el curso.
Tengo una pregunta sobre las listas.
tengo una lista que necesito refrescar cada X tiempo. De echo tengo un hilop que esta recogiendo información constantemente.
¿Como se le notifica a la lista que se refreque?.
He probado a hacer mi propio adaptador, pero cuando cambio los datos, la lista no se entera y no hace nada.

Gracias

Responder
sebastian 21/08/2011 - 17:32

Hola!
antes que nada muy buen curso.para ser la primera ves que programo algo la lo entiendo bastante bien.
ahora tengo un problema con:

class AdaptadorTitulares extends ArrayAdapter {
Activity context;

AdaptadorTitulares(Activity context) {
super(context, R.layout.listitem_titular, datos);
this.context = context;
}
Eclipse me marca un error en la linea:
super(context,….
el error dice : No se puede hacer referencia a un campo de instancia context mientras se esté invocando explícitamente un constructor
he chequeado varias veces el codigo he incluso lo he comparado con el codigo ejemplo que descargue del articulo y parece estar bien escrito
no se si me he pasado algo por alto y no lo veo.
una ayudita me vendria genial
desde ya muchas gracias!!!

Responder
sebastian 21/08/2011 - 18:40

Solucionado jeje
Se me estaba pasando una C mayuscula. Que tema esto de Mayusculas y minusculas, una sola te puede dar un gran dolor de cabeza.

Responder
Julián 17/10/2011 - 19:38

Buenas,

Es posible que al pulsar alguno de los elementos ejecute una acción? tipo los botones. onClick

Responder
Julián 17/10/2011 - 19:39

Perdón no vi la información y está perfectamente claro en el post anterior :/

Responder
adogus 23/10/2011 - 0:03

hola. -Muchas gracias. me pregunto si hay alguna forma de que se muestren los datos de cada item de forma reducida y que cuando seleccione uno me muestre toda la informacion completa, es que cada item que creo contiene gran cantidad de informacion y requiero que solo me muestre toda esta informacion por item a la vez cuando el usuario lo requiera. gracias

Responder
admin 23/10/2011 - 13:47

Hola adogus, busca información sobre el control ExpandableListView, creo que es lo que necesitas. En la web hay algunos tutoriales que muestran cómo utilizarlo y personalizarlo. De todas formas, me lo apunto como posible nuevo tema para el curso. Saludos.

Responder
rae 26/10/2011 - 13:07

en la frase: aplicación fuera más agil y se reduciese el consumo de batería;
lo correcto seria: aplicación fuera más agil y se redujera o redujese el consumo de batería

Responder
sgoliver 26/10/2011 - 13:46

Lo siento RAE, me daré latigazos hasta caer inconsciente por haber cometido tal error… y además he escrito «agil» sin tilde!… iré al infierno por ello :) Gracias por el aviso.

Responder
ftp 08/01/2012 - 23:52

¿ Porque cada vez que se hace Scroll a la lista acude a la función getView reconstruyendo todo?

Responder
William 30/04/2012 - 18:21

1000 gracias por el tutorial. Como se puede implementar una imagen frente al titulo y subtitulo y que cuando de uno click sobre un item el icono cambie, he colocado un ImageView en el archivo listitem_titular.xml y en el archivo Demolistview.java he implementado en la creación de holder esta línea holder.imagen = (ImageView)item.findViewById(R.id.ImgIcon); y para cargar la imagen holder.imagen.setImageResource(R.drawable.icon); pero no sale la imagen. Necesito tambien es a parte de implementar la imagen es que cuando doy el scroll no se cambie esa imagen, ya que se vuelve a rediseñar el list.

Responder
Fer 02/05/2012 - 13:53

Oye socio, esta genial todo lo que haces, pero tengo una duda respecto a la adición de nuevos elementos de la lista, o de cambiar los ya existentes :

Para ello indicas que hemos de modificar el atributo TAG de «holder», pero si lo quiero hacer desde otro evento de boton (por ejemplo) como se deberia hacer??
He probado mil formas, pero no doy con la tecla, gracias de antemano

Responder
William 03/05/2012 - 15:33

Hola, ya logre colocar la imagen adicionando al XML estas líneas:

La clase Titular me quedó así:
public class Titular
{
private String titulo;
private String subtitulo;
private Integer dato;

public Titular(String tit, String sub, Integer dat){
titulo = tit;
subtitulo = sub;
dato = dat;
}

public String getTitulo(){
return titulo;
}

public String getSubtitulo(){
return subtitulo;
}

public Integer getDato(){
return dato;
}

}

DemoListview me quedó así:

public class DemoListView extends Activity {

private Titular[] datos = new Titular[25];
private static final Integer[] data_cod = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

for(int i=1; i<=25; i++)
datos[i-1] = new Titular("Título " + i, "Subtítulo largo " + i, 0);

//datos[1] = new Titular("Título 2", "Subtítulo largo 2", 1);

//datos[13] = new Titular("Título 14", "Subtítulo largo 14", 1);

final AdaptadorTitulares adaptador =
new AdaptadorTitulares(this);

final ListView lstOpciones = (ListView)findViewById(R.id.LstOpciones);

lstOpciones.setAdapter(adaptador);

lstOpciones.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView padre, View v, int position,
long id) {
// TODO Auto-generated method stub
// datos[posicion] = new Titular(padre.getChildAt(posicion).findViewById(R.id.LblTitulo).toString(), padre.getChildAt(posicion).findViewById(R.id.LblSubTitulo).toString(), 1);
// Toast.makeText(getApplicationContext(), String.valueOf(posicion) , Toast.LENGTH_SHORT).show();
data_cod[position] = 1;
// Refrescar la lista
adaptador.notifyDataSetChanged();

}
});

}

class AdaptadorTitulares extends ArrayAdapter {

Activity context;

AdaptadorTitulares(Activity context) {
super(context, R.layout.listitem_titular, datos);
this.context = context;
}

public View getView(int position, View convertView, ViewGroup parent)
{
View item = convertView;
ViewHolder holder;

if(item == null)
{
LayoutInflater inflater = context.getLayoutInflater();
item = inflater.inflate(R.layout.listitem_titular, null);

holder = new ViewHolder();
holder.titulo = (TextView)item.findViewById(R.id.LblTitulo);
holder.subtitulo = (TextView)item.findViewById(R.id.LblSubTitulo);
holder.imagen = (ImageView)item.findViewById(R.id.ImgIcon);

item.setTag(holder);
}
else
{
holder = (ViewHolder)item.getTag();
}

holder.titulo.setText(datos[position].getTitulo());
holder.subtitulo.setText(datos[position].getSubtitulo());
// if (datos[position].getDato() == 0) {
if (data_cod[position] == 0) {
holder.imagen.setImageResource(R.drawable.no_responde);
} else {
holder.imagen.setImageResource(R.drawable.si_responde);
}
return(item);
}
}

static class ViewHolder {
TextView titulo;
TextView subtitulo;
ImageView imagen;
}

}

Como veran he colocado un nuevo array data_cod donde quiero almacenar los valores que digiten por ejemplo si cuando hago click llamo una lista en la que me seleccionan un dato y allí guardo el valor. Pero el problema que tengo ahora es como poner un dato como por ejemplo en Subtitulo, porque como esta debo colocar los tres valores, lo que deseo es enviar un valor de 1 ó 0 a la variable dato en Titular donde identificaría si en esa posición digitaron un valor, por el momento lo tengo con el array que cree y refresto la lista con lo que defini en estas dos líneas

data_cod[position] = 1;
// Refrescar la lista
adaptador.notifyDataSetChanged();

espero que alguien me pueda ayudar con decirme como envio un solo dato a la lista ya quiero almacenar en Subtitulo el valor que digiten o seleccionen de una lista si es el caso, lo que estoy realizando es una especie de Encuesta y cada item de la lista es una pregunta y al hacer click sobre una de ellas me puede cargar una lista o una caja para digitar un valor, este es el proyecto que estoy haciendo y en el cual estos tutoriales me han servido bastante, disculpas por extenderme pero es para que vena más claro una posible utilización a este tutorial, gracias.

Responder
William 03/05/2012 - 21:37

Hola nuevamente, YA SOLUCIONE lo que queria de cambiar el subtitulo después de haber cargado los datos, en Titular defini los metodos de SET así:

public void setSubtitulo(String sub, String dat){
this.subtitulo = sub;
this.dato = dat;
}

y para el llamado lo realicé así:

datos[0].setSubtitulo(«Cambie el Subtitulo», 1);

gracias…

Responder
Todo sobre las ListViews, ViewHolder y CacheHolder » AndroidConnect 06/05/2012 - 19:53

[…] android-viewholder-banana-example : De RocBoronat donde implementa lo los viewholders y cache Sgolivert: Explica con gran detalle como implementar el […]

Responder
Luis Alejandro 15/01/2013 - 23:24

Muchas Gracias amigo por dedicar todas tus capacidades para este curso, nos ayuda a muchas personas y sin tener que pagar dinero, eres genial!, ademas que es un tema tan actual y prometedor para todos los desarrolladores

Responder
marcos 17/06/2013 - 18:34

Ante todo gracias por el manual, gran trabajo. En segundo lugar tengo una consulta, di en vez de guardar los datos en un array como se hace en este ejemplo, los quisiera en un xml, ¿que tengo que hacer?

Gracias por tú tiempo.

Responder
dsdn 12/07/2013 - 1:03

Magnifico curso, es un gran trabajo

Sin embargo, particularmente en este artículo hay algo que no me queda claro.

¿El objeto convertView es la última instancia usada del objeto (View) item en esa posición o es la última instancia usada del ultimo objeto (View) item usado?
Dicho de otra forma:

¿Internamente en el framework, solo se guada una instancia convertView o se guarda un convertView por cada elemento de la lista?

Si guarda solo una instancia convertView, entonces en framework sólo devolvería un convertView ¡= null si el anterior elemento del llamado a getView(….) es el mismo es el actual. Por ello la mayoría de las veces convertView sería null y el Layout R.layout.listitem_titular sería inflado muchas veces. Notese que el layout R.layout.listitem_titular es el mismo para todo elemento de la lista y por tanto solo debería ser inflado una sola vez, sin importar el número de llamados a getView(….).

La solución para sólo inflarlo una vez sería declarar una propiedad View singleItem de la clase AdaptadorTitulares, y sólo actualizarla su valor si este fuera null a convertView.

Si Internamente en el framework guarda convertView por cada elemento de la lista, entonces se el Layout R.layout.listitem_titular sería inflado tantas veces como elementos tiene la lista. Notese que el layout R.layout.listitem_titular es el mismo para todo elemento de la lista y por tanto solo debería ser inflado una sola vez, sin importar el número de llamados a getView(….).

La solución para sólo inflarlo una vez sería la misma que la anterior.

Como pones sólo dos optimizaciones y no incluyes esta (o sea inflar el Layout R.layout.listitem_titular sólo una vez) pues me causa la duda de si entendí bien o no lo que explicabas sobre las dos optimizaciones.

Saludos

Responder
dsdn 12/07/2013 - 4:40

La clase ViewHolder no puede ser statica

static class ViewHolder {
TextView titulo;
TextView subtitulo;
}

debería ser:

public class ViewHolder {
TextView titulo;
TextView subtitulo;
}

Responder
rackfa881618 23/07/2013 - 21:46

Hola sgoliver gracias por tu tutorial me ha ayudado en algunas cosas he indagado en otros muy buenos tambien solo ando en una pequeña consulta ya tengo mi aplicacion con acceso a los datos que me sirve un sitio web y se actuaiza perfectamente a hacer scroi hasta el ultimo item mi unica duda es que como mantengo su posicion del item ejemplo tengo 20 registros de los cuales muestro los primeros diez entonces hasta hacer scroll al ultimo registro mostrado automaticamente me carga los otros 10 que faltan mi problema es que cuando muestro los ultimos 10 automaticamente me regresa al primer registro y tengo que recorrer los primeros 10 que ya recorri mas los nuevos y lo que quiero esque me lo actualize pero que me mantenga en el ultimo registro mostrado o sea la 10 y asi hacer scroll hasta la 20

Responder
AAron 05/09/2013 - 17:47

Hola, antes que nada agradecerte todo lo que haces. Siempre has sido la primera referencia que busco cuando tengo alguna duda. Quisiera que me dijeras como se puede conseguir para tras un longclick (en el caso de tu ejemplo sobre el subtítulo) pueda detectar el item (en definitiva el objeto) seleccionado y llamar a un metodo cualquiera dentro del propio Adapter. Lo he intentado hacer pero normalmente me dá otro objeto del ListView que no es el seleccionado. Espero haberme explicado. Gracias de antemano. Saludos

Responder
David 24/01/2014 - 12:16

Estoy probando estos ejemplos y aprendiendo gracias a sgoliver.
Tengo una duda respecto a este apartado:

He creado un elemento más en el ListView que es un ToggleButton. Pero no se como obtener la posición en la lista del boton que clico en su evento onClick.

Alguien me podria decir dentro del onClick del boton como obtener la posición que ocupa el boton clicado en la lista?

Gracias

Responder
Kina 29/01/2015 - 14:08

Hola a todos,

Lo primero dar las gracias a Salvador por este magnífico WEBSite sobre programación para Android.

Quisiera exponer un problema con un ListView a ver si alguien sabe decirme que ocurre.

Tengo un ListView con su Listener para onClick que funciona correctamente (setOnItemClickListener), pero sorprendentemente cuando añado un par de botones al layout para cada item, el listener del ListView deja de funcionar, sin embargo los listener de los botones funcionan, éstos están añadidos en el getview del customadapter y el listener del ListView en la actividad principal.

Si suprimo los botones, sin realizar ninguna otra modificación, el listener del ListView vuelve a funcionar.

¿Es posible tener listener para el propio ListView y para alguno de sus elementos de forma simultánea? Si lo es, agradecería alguna ayuda al respecto.

Un saludo,

Kina

Responder
Jose Augusto 08/02/2015 - 22:43

Hola me podrían Ayudar a Listar Datos desde un Web Service y mostrarlos en un Listview Personalizado por ejemplo

NOMBREPRODUCTO
codigo precio
—————————–
NOMBREPRODUCTO
codigo precio
——————————
NOMBREPRODUCTO
codigo precio
—————————-

claro todo esto usando un Listview por favor ayudenme.
gracias

Responder
Interfaz de usuario en Android: Controles de selección (IV) | sgoliver.net blog 24/02/2015 - 19:34

[…] aplicar de forma practicamente directa todo lo comentado para las listas en los dos artículos anteriores, es decir, la personalización de las celdas para presentar datos complejos creando nuestro propio […]

Responder
Lorena Oróstegui 02/06/2015 - 19:04

Hola Dalvador, sabes todo bien hasta ahora pero en esta línea
f(item == null)
{
LayoutInflater inflater = context.getLayoutInflater();
item = inflater.inflate(R.layout.listitem_titular, null);

context me tira error. estoy en Android Studio 1.2 :)

Responder
Curso Programación Android por Salvador Gómez – Indice de Contenidos | Miguel Moyetones 17/06/2015 - 17:51

[…] Controles de selección (III): Listas optimizadas (ViewHolder) [v3] [Actualizado] […]

Responder
Sadainer Hernandez 27/08/2015 - 21:47

Buenas tardes, tengo ya bastante tiempo con un problema y no he podido solucionar

En mi list_layout tengo un control EditText al cual necesito llenar con un valor para luego recorrer el ListView y obtener todos las valores. Apenas hago Scroll se pierden esos valores y hasta el momento no he podido solucionarlo

Responder
Lorenzo Fernández 10/02/2016 - 19:50

Hola,
Ante todo quiero agradecerte el enorme esfuerzo y la dedicación para que otros podamos aprender.
Tengo un problema con este tema en la siguiente parte del código:
if(item == null)
{
LayoutInflater inflater = context.getLayoutInflater();
item = inflater.inflate(R.layout.listitem_titular, null);
}
Me da un error context y no consigo averiguar cual es el problema.

Por favor, ¿Me puedes ayudar?

Muchas Gracias,

Responder

Responder a rae

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. Aceptar Más Información

Política de Privacidad y Cookies