Otra componente que nos provee Material Design son las tarjetas (Card), para ello Compose dispone de la función composable Card.
El empleo de las tarjetas es agrupar contenido y acciones sobre un solo tema de nuestra aplicación.
Confeccionar una aplicación que muestre la bandera, nombre del país y cantidad de habitantes de 3 países. Mostrar cada país en una tarjeta separada (Card)
Crear un proyecto llamado Compose20, la interfaz visual de la misma debe ser similar a:

El código fuente que debemos implementar es:
package com.tutorialesprogramacionya.compose20
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.Card
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import java.text.DecimalFormat
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Listado(paises = paises)
}
}
}
data class Pais(val nombre: String, val cantidadHabitantes: Int, val bandera: Int)
val paises = listOf<Pais>(
Pais("Argentina", 44000000, R.drawable.argentina),
Pais("Brasil", 211000000, R.drawable.brasil),
Pais("Colombia", 50000000, R.drawable.colombia)
)
@Composable
fun Listado(paises: List<Pais>) {
LazyColumn {
items(paises) { pais ->
Tarjeta(pais)
}
}
}
@Composable
fun Tarjeta(pais: Pais) {
Card(
elevation = 5.dp,
modifier = Modifier
.padding(10.dp)
.fillMaxWidth()
) {
Row(modifier = Modifier.padding(6.dp)) {
Image(
painter = painterResource(id = pais.bandera),
contentDescription = null,
contentScale = ContentScale.Crop,
)
Spacer(modifier = Modifier.width(10.dp))
Column() {
Text(
text = pais.nombre,
style = MaterialTheme.typography.h3
)
Text(
text = "${DecimalFormat("###,###,###").format(pais.cantidadHabitantes)} habitantes",
style = MaterialTheme.typography.body1
)
}
}
}
}
Declaramos un data class para luego pasar a definir una lista con tres elementos de dicha clase:
data class Pais(val nombre: String, val cantidadHabitantes: Int, val bandera: Int)
val paises = listOf<Pais>(
Pais("Argentina", 44000000, R.drawable.argentina),
Pais("Brasil", 211000000, R.drawable.brasil),
Pais("Colombia", 50000000, R.drawable.colombia)
)
La primer función recorre la lista de países y llamamos a la segunda función composable que mostrará cada pais:
@Composable
fun Listado(paises: List<Pais>) {
LazyColumn {
items(paises) { pais ->
Tarjeta(pais)
}
}
}
La función tarjeta recibe un objeto de la clase Pais y procede a llamar a la función composable Card, pasando como parámetro la elevación (el cual permite ver una sombra en el borde de la tarjeta), luego también iniciamos el parámetro modifier, llamando al método padding y fillMaxWidth para que las tarjetas ocupen todo el espacio en el ancho:
@Composable
fun Tarjeta(pais: Pais) {
Card(
elevation = 5.dp,
modifier = Modifier
.padding(10.dp)
.fillMaxWidth()
) {
Row(modifier = Modifier.padding(6.dp)) {
Image(
painter = painterResource(id = pais.bandera),
contentDescription = null,
contentScale = ContentScale.Crop,
)
Spacer(modifier = Modifier.width(10.dp))
Column() {
Text(
text = pais.nombre,
style = MaterialTheme.typography.h3
)
Text(
text = "${DecimalFormat("###,###,###").format(pais.cantidadHabitantes)} habitantes",
style = MaterialTheme.typography.body1
)
}
}
}
}
El contenido de la tarjeta lo disponemos dentro de una fila. El primer elemento es la bandera y luego para que el nombre del país y la cantidad de habitantes aparezcan uno debajo del otro debemos llamar a la función Column.
Este proyecto lo puede descargar en un zip desde este enlace: Compose20.zip