Curso App para Pizzería con delivery
¿Cómo inflar un ListView usando un Adapter con una API Rest?
Mostrar en un ListView las Categorías de productos de la pizzería.
Diseño e implementación de StoreActivity
FUNCIÓN: Cargar las categorías desde el servidor web y asignarles el evento click.
APRENDERÁS A : ¿Cómo inflar un ListView usando un Adapter con una API Rest?
Pasos:
Modificamos la ruta categorias de GET a POST, además aprovechamos también para cambiar la ruta de productos a POST. Esto con el fin de dar un poco más de seguridad a nuestras rutas, recuerde que sanctum necesita del token para gestionar las rutas protegidas. Y es asi como debe de quedar el archivo routes/api.php del proyecto Laravel 9
...
Route::group(['middleware'=>["auth:sanctum"]],function () {
Route::get('logout', [UserController::class,'logout']);
Route::post('categorias', [JsonController::class,'categorias']);
Route::post('productos', [JsonController::class,'productos']);
});
....
public String getAccessToken(){
return _preference.getString(KEY_ACCESS_TOKEN,null);
}
package codea.app.pizzeria9.modelo;
public class Categoria {
int id;
String nombre;
public Categoria(int id, String nombre) {
this.id = id;
this.nombre = nombre;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.cardview.widget.CardView
android:layout_margin="20dp"
app:cardElevation="20dp"
app:cardCornerRadius="10dp"
app:cardBackgroundColor="@color/tercerColor"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:padding="20dp"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txtNombre"/>
</androidx.cardview.widget.CardView>
</androidx.appcompat.widget.LinearLayoutCompat>
class CategoriaAdapter extends BaseAdapter{
private Context context;
private ArrayList<Categoria> listaCategoria;
public CategoriaAdapter(Context context, ArrayList<Categoria> listaCategoria) {
this.context = context;
this.listaCategoria = listaCategoria;
}
@Override
public int getCount() {
return listaCategoria.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(view == null){
view = inflater.inflate(R.layout.categoria,null);
TextView nombre = view.findViewById(R.id.txtNombre);
nombre.setText(listaCategoria.get(i).getNombre());
}
return view;
}
}
Este método se determina POST con la ruta categorias, declaramos un arrayList de Categoria con un encabezado con el token para autorizar el acceso del usuario a este tipo de información; la API Rest es quién controla el acceso del usuario con sanctum de Laravel
/// Extraer las categorías
@POST("categorias")
Call<ArrayList<Categoria>> getCategorias(
@Header("Authorization") String access_token
);
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".StoreActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listViewCategoria"/>
</androidx.appcompat.widget.LinearLayoutCompat>
En StoreActivity instanciamos el listView
...
private ListView _listViewCategoria;
....
....
_listViewCategoria = findViewById(R.id.listViewCategoria);
....
Implementamos el método que al ser llamado, inflará el listview , para que se ejecute correctamente enviamos un encabezado con el token al servidor web, este debe devolvernos una objeto Json de Categorias.
...
private ArrayList<Categoria> listacategorias = new ArrayList<>();
....
private void getListaCategorias(){
Call<ArrayList<Categoria>> call = RetrofitClient.getApiService().getCategorias(
"Bearer "+_sessionManager.getAccessToken()
);
call.enqueue(new Callback<ArrayList<Categoria>>() {
@Override
public void onResponse(Call<ArrayList<Categoria>> call, Response<ArrayList<Categoria>> response) {
if(response.isSuccessful()){
listacategorias = response.body();
CategoriaAdapter adapter = new CategoriaAdapter(getApplicationContext(), listacategorias);
_listViewCategoria.setAdapter(adapter);
}
}
@Override
public void onFailure(Call<ArrayList<Categoria>> call, Throwable t) {
}
});
}
Simplemente llamamos al método getListaCategorias() que llenará el listview con las categorias desde el servidor web en StoreActivity.
...
getListaCategorias();
....
El evento click lanza la actividad ProductosActivity quien cargará todos los productos de la categoría elegida.
....
_listViewCategoria.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
startActivity(new Intent(getApplicationContext(),ProductosActivity.class)
.putExtra("categoria_id",listacategorias.get(i).getId())
);
}
});
....
1071 visitas
Descarga el código fuente del proyecto adquiriendo el curso completo
Comprar© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2024