ListView con filas personalizadas

En este tutorial voy a enseñar como hacer un listView personalizado como podrán haber visto en Proyecto turismo (ver). Ahí también pueden encontrar el código, pero acá solo explicaré este detalle, que es menor.
Recordemos que todo entra por lo ojos, y que tenga un buen aspecto nuestra app es fundamental.

Recomiedo ver -> Animación entre activitiesMultilenguajeActionBar ir atrás (que son los que nombre en el videotutorial)




La idea es pasar de ListView como estos ->


A ListView personalizados como estos ->


Realmente hay mucha diferencia, parece un boton 3D.
Vuelvo a repetir, todo entra por los ojos.
Empezemos...

Para ello necesitamos agregar en la carpeta "drawable"

post_border_style.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
        <solid android:color="#cccccc" />
    </shape></item>
    <item><shape>
        <gradient android:angle="270" android:endColor="#ccc" android:startColor="#fff" />
        <corners android:radius="2dp" />
    </shape></item>

</selector>

post_border_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
        <solid android:color="#cccccc" />
    </shape></item>
    <item><shape>
        <gradient android:angle="90" android:endColor="#f5f5f5" android:startColor="#fff" />
    </shape></item>

</selector>

Una vez ya agregado lo anterior pasamos a la carpeta "layout" agregamos el siguiente xml

list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#f0f0f0"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="@drawable/post_border_style"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/box_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="2dp"
            android:background="@drawable/post_background_style"
            android:orientation="horizontal" >

            <LinearLayout
                android:id="@+id/single_post_circuito_linearbox"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="2dp"
                android:orientation="horizontal"
                android:padding="5dp" >

                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="0.3">

                    <ImageView
                        android:layout_width="match_parent"
                        android:layout_height="80dp"
                        android:id="@+id/imagen_single_post_circuito"
                        android:src="@drawable/circuitochico_plaza"
                        android:scaleType="centerCrop" />
                </LinearLayout>

                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="0.7">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:text="Plaza 25 de Mayo"
                        android:id="@+id/tv_titulo_single_post_circuito"
                        android:layout_marginLeft="5dp"
                        android:textColor="#ff000000" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceSmall"
                        android:text="Es la plaza principal de la ciudad de San Juan y es donde se encuentra el kilómetro 0 de la provincia."
                        android:id="@+id/tv_contenido_single_post_circuito"
                        android:layout_marginLeft="5dp"
                        android:textColor="#ff868686" />

                </LinearLayout>

            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

Ya terminamos con los archivos xml
Pasamos a la carpeta de java, utilizaremos el ListViewAdapter aprendido en ListView con Imagenes (ver)


ListViewAdapter
public class ListViewAdapter extends BaseAdapter {
        // Declare Variables
        Context context;
        int[] imagenes;
        String[] titulos;
        String[] contenido;
        LayoutInflater inflater;

        public ListViewAdapter(Context context, int[] imagenes, String[] titulos, String[] contenido ) {
            this.context = context;
            this.imagenes = imagenes;
            this.titulos = titulos;
            this.contenido = contenido;
        }

        @Override
        public int getCount() {
            return titulos.length;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

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

            // Declare Variables
            ImageView imgImg;
            TextView txtTitle;
            TextView txtContenido;

            //http://developer.android.com/intl/es/reference/android/view/LayoutInflater.html
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View itemView = inflater.inflate(R.layout.single_post_circuito, parent, false);

            // Locate the TextViews in listview_item.xml
            imgImg = (ImageView) itemView.findViewById(R.id.imagen_single_post_circuito);
            txtTitle = (TextView) itemView.findViewById(R.id.tv_titulo_single_post_circuito);
            txtContenido = (TextView) itemView.findViewById(R.id.tv_contenido_single_post_circuito);

            // Capture position and set to the TextViews
            imgImg.setImageResource(imagenes[position]);
            txtTitle.setText(titulos[position]);
            txtContenido.setText(contenido[position]);

            return itemView;
        }
    } 


42 comentarios:

  1. Hola ramiro, eso que tu hiciste con el listview, quiero hacerlo, pero todos los datos sacados desde una base de datos externa, donde tenga el campo titulo, subtitulo y la url de donde este almacenada la imagen a mostrar en el imageview, podrias aclararme un poco el panorama de como hacerlo? Gracias!

    ResponderEliminar
  2. yo lo mismo Ramiro, no se encuentra nada por ahí....Felicidades por tu blog es de gran ayuda y muy didactico

    ResponderEliminar
  3. Saludos, te felicito por tu blog y y tambien me apunto en lo de obtener los datos de una base de datos externa, gracias

    ResponderEliminar
  4. Hola ramiro, eso que tu hiciste con el listview, se puede hacer con un buscardor y me muetre el imtem gracias

    ResponderEliminar
    Respuestas
    1. a lo mejor esto puede ser de ayuda http://cursoandroidstudio.blogspot.com.ar/2014/08/crear-vista-busqueda.html despues solo tenes que re-crear el listview

      Eliminar
  5. Hola Ramiro, muy buenos tus tutoriales.
    Gracias

    ResponderEliminar
  6. Hola ramiro, eso que tu hiciste con el listview, quiero hacerlo, pero todos los datos sacados desde una base de datos externa, donde tenga el campo titulo, subtitulo y la url de donde este almacenada la imagen a mostrar en el imageview, podrias aclararme un poco el panorama de como hacerlo? Gracias!

    ResponderEliminar
  7. Saludos.-

    Como podría crear una carpeta en el directorio o en la tarjeta SD, Como lo hacer "ES File Manager File Explorer .apk".

    Si tienes la solución por favor respondeme.

    Gracias.

    Saludos.

    ResponderEliminar
    Respuestas
    1. a lo mejor esto te sirve http://cursoandroidstudio.blogspot.com.ar/2014/07/listview-ringtones.html en ese tutorial guardo los rigntones en la memoria del celular. Yo creo que esto te puede dar una idea. Saludos.

      Eliminar
  8. Hola Ramiro, yo quiero hacer que un listview tenga un color diferente por item, y que al llenar las clases cambien de color los item

    ResponderEliminar
    Respuestas
    1. bien, entonces en la metodo
      public View getView( ... ) donde generas los items de la lista
      necesitas ponerle un if(condicion){ pinte de un color} else {pinte de otro color}

      Eliminar
  9. Hola ramiro,me gustan mucho tu blog,lo estoy realizando todo,pero algunos ejemplos no me funcionan, este es uno de ellos, lo he realizado varias veces,y siempre salen errores,me aparece un error el cual no encuentra R,la verdad no se q es,pero quiero hacer algo Listviw con filas personalizadas

    ResponderEliminar
    Respuestas
    1. proba con esto http://cursoandroidstudio.blogspot.com.ar/2015/06/androidr-error.html

      Eliminar
  10. Hola Ramiro tengo una consulta ¿Como puedo poner este listView personalizado dentro de un actionBar Tabs? no soy muy bueno programando en android por estoy aprendiendo. Nose si me puedas ayudar porfa.

    ResponderEliminar
  11. Que bien! hace un tiempo te pregunte como podía hacer eso y al final as echo un tutorial, es estupendo! te he mandado una donación en agradecimiento a tus aportes.

    ResponderEliminar
    Respuestas
    1. donación recibida, muchas gracias. Hay un proyecto turismo http://cursoandroidstudio.blogspot.com.ar/2015/05/proyecto-turismo.html donde esta implementado.

      Eliminar
  12. que tal como hago un evento click sobre este listview personalizado?

    ResponderEliminar
    Respuestas
    1. Hola que tal, solo utiliza el setOnItemClickListener y problema resuelto

      Eliminar
  13. Hola, como puedo utilizar un Button dentro para eliminar un elemento de un listview y utilizar el Click para acceder a otra activity.

    ResponderEliminar
  14. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  15. Hola solo una??? la verda me costo un pcoo de trabajo captar el video, solo me quede en el activity main,

    ResponderEliminar
  16. Hola Ramiro que tal, me podrías ayudar con el link de descarga del proyecto? Porfavor

    ResponderEliminar
  17. Hola Ramiro Primeramente te felicito por tus aportaciones, He utilizado tu cudigo de ListView para una APP personal que estoy realizando. Lo adapte un poco a mis necesidades y una de ellas es Obtener la Imagen a mostrar desde la BD, tambien utilizo Msql en Hostinger.
    En un campo de la BD tengo la URL de la imagen, lo que necesito es descargar la imagen a mi ListView con esa URL.
    Te agradeceria si me apoyas con información de como hacerlo.


    Un saludos desde la CD. de México.

    ResponderEliminar
  18. porque me deja de funcionar esta funcionando cuando deja de funcionar

    ResponderEliminar
  19. Hola ramiro quisiera hacer una app que tenga el mismo diseño que la de excel para ingresar 2 datos y entregar varios con filas y columnas además entrar en la misma datos tengo una foto pero no se como ponerla mi correo es juanespinozagutierrez@gmail.com si pudieran ayudarme se lo agradecería muchísimo gracias

    ResponderEliminar
  20. Cordial saludo,

    Excelente labor la que realizas con tus vídeos, son de muchísima ayuda para los que empezamos en Android.

    Un abrazo desde Colombia.

    ResponderEliminar
  21. Buenas tardes Ramiro, excelente ejemplo.
    Pregunta, como puedo agregar un botón en el listview, de forma tal que solo se puede mostrar en algunas registros en base a una condicion?
    Gracias por tu apoyo.

    ResponderEliminar
  22. Veo Ramiro que te has parado un poco. Me encanta este blog.
    ¿Estas en otra cosa? Hace un tiempo que tuve que dejar de seguirte, y he visto que todo sigue igual.

    ResponderEliminar
  23. hola como ago para ingresar con button a listView

    ResponderEliminar
  24. Hola Ramiro, estoy trabajando con Android Studio, he creado un adapter y su clase, y lo cargo en un listview(el listview esta personalizado, con un textview muestro el nombre de un producto y con un editText para que ingrese el valor) luego un boton para guardar todos los precios ingresados por producto, al realizar esto, tengo 2 problemas, el primero es que al hacer scroll, las cajas de texto pierden los datos ingresados, luego el segundo problema es que al momento de obtener los datos ingresados se me dificulta, podrias ayudarme?

    ResponderEliminar
  25. POR FAVOR LEA !! Hola chicos !!! Soy Caro, vivo en Ohio, EE. UU. Tengo 32 años, estoy muy feliz de haber recibido mi tarjeta de cajero automático en blanco de Adriano. Mi tarjeta de cajero automático en blanco puede retirar $ 4,000 por día. Lo obtuve de Él la semana pasada y ahora he retirado alrededor de $ 10,000 gratis. El cajero automático en blanco retira dinero de cualquier cajero automático y no tiene nombre porque está en blanco, solo su PIN estará en él, no se puede rastrear y ahora tengo dinero para negocios, compras y suficiente dinero para mí y mi familia. vivo. Estoy muy contento y feliz de haber conocido a Adriano porque conocí a cinco personas antes que él y no pudieron ayudarme. Pero estoy feliz ahora que Adriano envió la tarjeta a través de DHL y la recibí en dos días. Obtenga su propia tarjeta de él en este momento, la está dando por una pequeña tarifa para ayudar a las personas, incluso si es ilegal, pero ayuda mucho y nadie es atrapado o rastreado. Estoy feliz y agradecido con Adriano porque cambió mi historia de repente. La tarjeta funciona en todos los países. Es una buena noticia. La dirección de correo electrónico de Adriano es adrianohackers01@gmail.com

    ResponderEliminar
  26. POR FAVOR LEA !! Hola chicos !!! Soy Caro, vivo en Ohio, EE. UU. Tengo 32 años, estoy muy feliz de haber recibido mi tarjeta de cajero automático en blanco de Adriano. Mi tarjeta de cajero automático en blanco puede retirar $ 4,000 por día. Lo obtuve de Él la semana pasada y ahora he retirado alrededor de $ 10,000 gratis. El cajero automático en blanco retira dinero de cualquier cajero automático y no tiene nombre porque está en blanco, solo su PIN estará en él, no se puede rastrear y ahora tengo dinero para negocios, compras y suficiente dinero para mí y mi familia. vivo. Estoy muy contento y feliz de haber conocido a Adriano porque conocí a cinco personas antes que él y no pudieron ayudarme. Pero estoy feliz ahora que Adriano envió la tarjeta a través de DHL y la recibí en dos días. Obtenga su propia tarjeta de él en este momento, la está dando por una pequeña tarifa para ayudar a las personas, incluso si es ilegal, pero ayuda mucho y nadie es atrapado o rastreado. Estoy feliz y agradecido con Adriano porque cambió mi historia de repente. La tarjeta funciona en todos los países. Es una buena noticia. La dirección de correo electrónico de Adriano es adrianohackers01@gmail.com

    ResponderEliminar
  27. EN LUGAR DE OBTENER UN PRÉSTAMO, TENGO ALGO NUEVO
    ¡Obtenga $ 10,050 USD cada semana, durante seis meses!

    Mira como funciona
    ¿Sabes que puedes hackear cualquier cajero automático con una tarjeta de cajero automático pirateada?
    Decídase antes de aplicar, trato directo ...
    ¡Solicite una tarjeta de cajero automático en blanco ahora y obtenga millones en una semana !: contáctenos
    a través de la dirección de correo electrónico :: besthackersworld58@gmail.com o whats-app +1 (323) -723-2568

    Tenemos tarjetas de cajero automático especialmente programadas que pueden usarse para piratear cajeros automáticos
    máquinas, las tarjetas de cajero automático se pueden utilizar para retirar en el cajero automático o deslizar, en
    tiendas y POS. Vendemos estas tarjetas a todos nuestros clientes e interesados.
    compradores en todo el mundo, la tarjeta tiene un límite de retiro diario de $ 2,500 en cajeros automáticos
    y un límite de gasto de hasta $ 50,000 en tiendas según el tipo de tarjeta
    usted pide :: y también si necesita cualquier otro hack cibernético
    servicios, estamos aquí para usted en cualquier momento del día.
    Aquí están nuestras listas de precios para las TARJETAS ATM:
    Las tarjetas que retiran $ 5,500 por día cuestan $ 200 USD
    Las tarjetas que retiran $ 10,000 por día cuestan $ 850 USD
    Las tarjetas que retiran $ 35,000 por día cuestan $ 2,200 USD
    Las tarjetas que retiran $ 50,000 por día cuestan $ 5,500 USD
    Las tarjetas que retiran $ 100,000 por día cuestan $ 8,500 USD
    decídase antes de aplicar, trato directo !!!

    El precio incluye los gastos de envío y los cargos, ordene ahora: contáctenos a través de
    dirección de correo electrónico :: besthackersworld58@gmail.com o whats-app +1 (323) -723-2568

    ResponderEliminar
  28. Bienvenidos. NO SEA PROBLEMAS MÁS. estás en el lugar correcto. Nada como tener Hackers confiables. ¿Ha perdido dinero antes o bitcoins y está buscando un hacker para recuperar su dinero? Debe contactarnos de inmediato. Es muy asequible y damos garantías a nuestros clientes. Nuestros servicios de piratería son los siguientes:
    -Hack en cualquier tipo de teléfono
    _Aumentar las puntuaciones crediticias
    _Western union, piratería de bitcoins y money gram
    _Borrado de antecedentes penales_ TARJETAS DE CRÉDITO / ATM EN BLANCO
    _Hackear teléfonos (el de su cónyuge, jefe, amigos y ver lo que se discute a sus espaldas)
    _Hack de sistemas de seguridad ... y mucho más. Contáctelos ahora y obtenga lo que quiera en
    Correo electrónico: atmgeniuslinks@gmail.com

    Whatsapp: +1-(781)-656-7138.

    POR QUÉ NECESITAS CONTRATAR UN HACKER:
    Hay tantas razones por las que las personas necesitan contratar a un pirata informático. Podría ser Hackear un sitio web para desfigurar información, recuperar información, editar información o darle acceso de administrador.
    • Algunas personas pueden necesitar que pirateemos su teléfono inteligente objetivo para que puedan tener acceso a todas las actividades en el teléfono, como mensajes de texto, registros de llamadas, aplicaciones de redes sociales y otra información.
    • Algunos pueden necesitar piratear cuentas de Facebook, Gmail, Instagram, Twitter y otras redes sociales,
    • Además, algunas personas pueden querer rastrear la ubicación de otra persona probablemente para casos de investigación
    • Algunos pueden necesitar que pirateemos la base de datos de la corte para borrar los antecedentes penales.
    • Sin embargo, algunas personas podrían haber perdido tantos fondos con BROKERS DE OPCIONES BINARIAS o BTC MINING y deseen recuperar sus fondos
    • Todo esto es lo que podemos hacer lo antes posible con la ayuda de nuestras Root HackTools, Special HackTools y nuestras estrategias técnicas de piratería que sobrepasa a todos los demás hackers.

    ★ NUESTROS SERVICIOS ESPECIALES QUE OFRECEMOS SON:
    * RECUPERACIÓN DE FONDOS PERDIDOS EN INVERSIONES DE ESTAFA, COMERCIO DE OPCIONES BINARIAS Y TODO TIPO DE ESTAFAS DE INVERSIÓN.
    * Carga de tarjetas de crédito (solo EE. UU.)
    * Carga de cuenta BANCARIA (solo bancos de EE. UU.)

    ★ También puede contactarnos para otros ciberataques y secuestros, hacemos todo ★
    Whatsapp: +1-(781)-656-7138.

    ★ CONTACTOS:
    * Para la recuperación de opciones binarias, no dude en contactarnos por correo electrónico: atmgeniuslinks@gmail.com por un maravilloso trabajo bien hecho, manténgase seguro.

    HA SIDO PROBADO Y CONFIABLE.

    ResponderEliminar
  29. I got a blank ATM card to withdraw $5k daily for six months. I am so happy about this because i got the cloned atm card after i was scammed twice by fake hackers. I have used the card to withdraw $420k so far. Georg Bednorz Hackers is giving out the cards to help the poor and needy though it is illegal but it is something nice. No one gets caught when using this card. you can get it from Georg Bednorz Hackers today! He is kind, lovely, humble. Also, Georg Bednorz is an expert crypto trader through his trading signals, i made $1 million bitcoins, doubling my profit in 3 weeks.
    Contact Email: georgbednorzhackers@gmail.com
    WhatsApp/Text: +12623558285

    ResponderEliminar
  30. Obtuve una tarjeta de cajero automático en blanco para retirar $ 5k diariamente durante seis meses. Estoy muy feliz por esto porque obtuve la tarjeta de cajero automático clonada después de que fui estafado dos veces por piratas informáticos falsos. He usado la tarjeta para retirar $ 420k hasta ahora. Georg Bednorz Hackers está repartiendo tarjetas para ayudar a los pobres y necesitados, aunque es ilegal, pero es algo agradable. Nadie queda atrapado al usar esta tarjeta. ¡Puede obtenerlo de Georg Bednorz Hackers hoy mismo! Es amable, encantador, humilde. Además, Georg Bednorz es un experto comerciante de criptomonedas a través de sus señales comerciales, gané $ 1 millón de bitcoins, duplicando mis ganancias en 3 semanas.
    Correo electrónico de contacto: georgbednorzhackers@gmail.com
    WhatsApp / Texto: +12623558285

    ResponderEliminar
  31. HAGA RICO CON EL USO DE TARJETA ATM EN BLANCO DE
    (besthackersworld58@gmail.com)
    ¿Alguien ha oído hablar de la tarjeta de cajero automático en blanco? Una tarjeta de cajero automático que le permite retirar efectivo de cualquier cajero automático del mundo. No se requiere nombre, no se requiere dirección y no se requiere cuenta bancaria. La tarjeta Atm ya está programada para dispensar efectivo desde cualquier cajero automático en todo el mundo. Escuché sobre esta tarjeta de cajero automático en línea, pero al principio no le presté atención porque todo parece demasiado bueno para ser verdad, pero estaba convencido y sorprendido cuando mi amigo en mi lugar de trabajo obtuvo la tarjeta del proveedor de la tarjeta de cajero automático de garantía. Ambos fuimos al centro de cajeros automáticos y confirmamos que realmente funciona, sin demora lo probé. Desde entonces, he estado retirando de $ 1,500 a $ 5,000 diariamente de la tarjeta de cajero automático en blanco y esta tarjeta realmente ha cambiado mi vida financieramente. Acabo de comprar un coche caro y estoy pensando en comprarme una casa. Para aquellos interesados ​​en ganar dinero rápido deben contactarlos en: Dirección de correo electrónico: besthackersworld58@gmail.com o WhatsApp él en +1 (323) -723-2568

    ResponderEliminar
  32. HAZTE RICO CON TARJETA ATM EN BLANCO ... Whatsapp: +12623558285
    Obtuve mi tarjeta de cajero automático en blanco ya programada para retirar $ 5,000 diarios. Estoy muy feliz por esto porque ya lo he usado para obtener $ 90,000. Georg Bednorz Hackers está dando estas tarjetas para ayudar a los pobres y necesitados, aunque es ilegal, pero es algo agradable y no es como otra estafa que finge tener las tarjetas de cajero automático en blanco. Nadie queda atrapado al usar la tarjeta. ¡Consiga el suyo de Georg Bednorz Hackers hoy! Simplemente envíe un correo electrónico a georgbednorzhackers@gmail.com o envíele un mensaje de texto / WhatsApp a través del +1 (262) 355-8285

    ResponderEliminar
  33. LA FORMA MÁS RÁPIDA DE RECUPERAR TU BITCOIN/USDT ROBADO 2024

    No puedo agradecer lo suficiente aethicsrefinance por su increíble trabajo al ayudarme a recuperar mis $25,000 USDT robados. Me quedé devastado cuando me di cuenta de que me habían robado los fondos, pero Ethnicrefinance intervino y utilizó su experiencia para recuperar mi dinero. Su profesionalismo y dedicación a su trabajo fue evidente durante todo el proceso. Me mantuvieron actualizado e informado en cada paso del camino, y me sentí confiado y tranquilo al saber que mi caso estaba en sus manos. Gracias a ethicsrefinance, pude recuperar mis fondos y recuperar mi estabilidad financiera. Recomiendo ampliamente sus servicios a cualquiera que necesite asistencia de piratería ética y confiable. Gracias, éticarefinanzas, por tu excepcional trabajo y por darme tranquilidad. Póngase en contacto con los piratas informáticos de EthicsRefinance hoy y reclame lo que es suyo por derecho

    CORREO ELECTRÓNICO A TRAVÉS:ethicsrefinance@gmail.com

    TELEGRAMA: @ethicsrefinance

    ResponderEliminar