Implementar una aplicación que permita recuperar todas las filas de una tabla de articulos.
Tenemos la tabla en un servidor web llamada:
create table articulos (
codigo int primary key AUTO_INCREMENT,
descripcion varchar(50),
precio float
);
Crearemos el proyecto 'Compose24'
Agregamos las dependencias de la biblioteca Volley:
dependencies {
...
implementation 'com.android.volley:volley:1.2.0'
}
Nuestra aplicación debe acceder a internet por lo que debemos pedir dicho permiso:
<uses-permission android:name="android.permission.INTERNET"/>
Debemos llamar a la URL:
https://scratchya.com.ar/videosandroidjava/volley/listararticulos.php
En el servidor hay un archivo en PHP llamado 'listararticulos.php':
<?php
header('Content-Type: application/json');
require("conexion.php");
$conexion = retornarConexion();
$datos = mysqli_query($conexion, "select codigo,descripcion,precio from articulos");
$resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
echo '{"lista":'.json_encode($resultado).'}';
?>
Y un segundo archivo 'conexion.php'
<?php
function retornarConexion() {
$server="localhost";
$usuario="xxxx";
$clave="xxxx";
$base="xxxx";
$con=mysqli_connect($server,$usuario,$clave,$base) or die("problemas") ;
mysqli_set_charset($con,'utf8');
return $con;
}
?>
La interfaz visual final debe ser similar a:

El código a implementar en Kotlin para obtener dicha funcionalidad es:
package com.tutorialesprogramacionya.compose24
import android.app.Activity
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ListadoArticulos(this)
setContent {
PantallaPrincipal()
}
}
}
data class Articulo(val codigo: Int, val descripicon: String, val precio: Float)
val articulos = mutableStateListOf<Articulo>()
fun ListadoArticulos(activity: Activity) {
val url = "https://scratchya.com.ar/videosandroidjava/volley/listararticulos.php"
val requestQueue = Volley.newRequestQueue(activity)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,
url,
null,
{ response ->
val jsonArray = response.getJSONArray("lista")
articulos.clear()
for (i in 0 until jsonArray.length()) {
val registro = jsonArray.getJSONObject(i)
val codigo = registro.getString("codigo")
val descripcion = registro.getString("descripcion")
val precio = registro.getString("precio")
articulos.add(Articulo(codigo.toInt(), descripcion, precio.toFloat()))
}
},
{ error ->
}
)
requestQueue.add(jsonObjectRequest)
}
@Composable
fun PantallaPrincipal() {
LazyColumn() {
items(articulos) { articulo ->
Card(
elevation = 5.dp,
modifier = Modifier
.padding(10.dp)
.fillMaxWidth()
) {
Column() {
Text(
text = "Codigo: ${articulo.codigo}",
fontSize = 18.sp,
modifier = Modifier.padding(start = 10.dp, end = 10.dp, bottom = 5.dp)
)
Text(
text = "Descripcion: ${articulo.descripicon}",
fontSize = 18.sp,
modifier = Modifier.padding(10.dp)
)
Text(
text = "Precio:${articulo.precio}",
fontSize = 16.sp,
modifier = Modifier.padding(10.dp)
)
}
}
}
}
}
Inmediatamente se inicia la aplicación procedemos a recuperar del servidor los datos que nos provee la url:
val url = "https://scratchya.com.ar/videosandroidjava/volley/listararticulos.php"
El formato es un Json similar a:

Creamos un objeto JsonObjectRequest y cuando recibimos la respuesta procedemos a cargar los datos en nuestra variable 'articulos', que como sabemos automáticamente actualizará la pantalla con la función composable 'PantallaPrincipal':
fun ListadoArticulos(activity: Activity) {
val url = "https://scratchya.com.ar/videosandroidjava/volley/listararticulos.php"
val requestQueue = Volley.newRequestQueue(activity)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,
url,
null,
{ response ->
val jsonArray = response.getJSONArray("lista")
articulos.clear()
for (i in 0 until jsonArray.length()) {
val registro = jsonArray.getJSONObject(i)
val codigo = registro.getString("codigo")
val descripcion = registro.getString("descripcion")
val precio = registro.getString("precio")
articulos.add(Articulo(codigo.toInt(), descripcion, precio.toFloat()))
}
},
{ error ->
}
)
requestQueue.add(jsonObjectRequest)
}
La función composable PantallaPrincipal procede a mostrar en una tarjeta (Card) individual los datos de cada artículo:
@Composable
fun PantallaPrincipal() {
LazyColumn() {
items(articulos) { articulo ->
Card(
elevation = 5.dp,
modifier = Modifier
.padding(10.dp)
.fillMaxWidth()
) {
Column() {
Text(
text = "Codigo: ${articulo.codigo}",
fontSize = 18.sp,
modifier = Modifier.padding(start = 10.dp, end = 10.dp, bottom = 5.dp)
)
Text(
text = "Descripcion: ${articulo.descripicon}",
fontSize = 18.sp,
modifier = Modifier.padding(10.dp)
)
Text(
text = "Precio:${articulo.precio}",
fontSize = 16.sp,
modifier = Modifier.padding(10.dp)
)
}
}
}
}
}
Este proyecto lo puede descargar en un zip desde este enlace: Compose24.zip