Sviluppare un'app in Java Android per la lista della spesa/Classe MainActivity
Aspetto
Il codice Java in MainActivity che gestisce l'inserimento dei prodotti, il salvataggio della lista della spesa, la scrittura sul file lista_spesa.csv, l'ordinamento dei prodotti per supermercato, scaffale, nome è il seguente:
package com.example.listadellaspesa;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import Utility.Product;
public class MainActivity extends AppCompatActivity {
private Spinner spinnerSupermercato, spinnerScaffale;
private EditText etProductName ;
private Button btnAdd, btnSave;
private ListView listView;
private ArrayList<Product> productList;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Inizializza gli elementi UI
etProductName = findViewById(R.id.etProductName);
btnAdd = findViewById(R.id.btnAdd);
btnSave = findViewById(R.id.btnSave);
listView = findViewById(R.id.listView);
spinnerSupermercato = findViewById(R.id.spinnerSupermarket);
ArrayAdapter<CharSequence> adapterSupermercato = ArrayAdapter.createFromResource(
this, R.array.supermercati, android.R.layout.simple_spinner_item);
adapterSupermercato.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerSupermercato.setAdapter(adapterSupermercato);
spinnerScaffale = findViewById(R.id.spinnerShelf);
ArrayAdapter<CharSequence> adapterScaffale = ArrayAdapter.createFromResource(
this, R.array.scaffali, android.R.layout.simple_spinner_item);
adapterSupermercato.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerScaffale.setAdapter(adapterScaffale);
// Inizializza lista dei prodotti
productList = new ArrayList<>();
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<>());
listView.setAdapter(adapter);
// Controlla se esiste il file CSV e carica i dati, altrimenti crealo
loadCsvData();
// Aggiungi un prodotto alla lista
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String productName = etProductName.getText().toString();
String supermarket = spinnerSupermercato.getSelectedItem().toString();
String shelf = spinnerScaffale.getSelectedItem().toString();
if (!productName.isEmpty() && !supermarket.isEmpty() && !shelf.isEmpty()) {
Product product = new Product(productName, supermarket, shelf);
productList.add(product);
updateListView();
clearInputFields();
} else {
Toast.makeText(MainActivity.this, "Inserisci tutti i campi", Toast.LENGTH_SHORT).show();
}
}
});
// Salva la lista su un file CSV
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveToCsv();
}
});
}
// Aggiorna la ListView e ordina la lista
private void updateListView() {
ArrayList<String> displayList = new ArrayList<>();
Collections.sort(productList, new Comparator<Product>() {
@Override
public int compare(Product p1, Product p2) {
int supermarketCompare = p1.getSupermarket().compareTo(p2.getSupermarket());
if (supermarketCompare != 0) {
return supermarketCompare;
} else {
return p1.getShelf().compareTo(p2.getShelf());
}
}
});
for (Product product : productList) {
displayList.add(product.getName() + " - " + product.getSupermarket() + " - " + product.getShelf());
}
adapter.clear();
adapter.addAll(displayList);
adapter.notifyDataSetChanged();
}
// Pulisci i campi di input
private void clearInputFields() {
etProductName.setText("");
}
// Salva i dati su CSV
private void saveToCsv() {
File file = new File(Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DOWNLOADS , "lista_spesa.csv");
try (FileWriter writer = new FileWriter(file)) {
// Intestazione
writer.append("Prodotto,Supermercato,Scaffale\n");
for (Product product : productList) {
writer.append(product.getName()).append(",");
writer.append(product.getSupermarket()).append(",");
writer.append(product.getShelf()).append("\n");
}
Toast.makeText(MainActivity.this, "Lista salvata su CSV", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
//Toast.makeText(MainActivity.this, "Errore nel salvataggio del CSV", Toast.LENGTH_SHORT).show();
Log.getStackTraceString(e);
}
}
private void loadCsvData() {
File file = new File(Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DOWNLOADS , "lista_spesa.csv");
if (file.exists()) {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
// Salta la prima riga (intestazione)
reader.readLine();
while ((line = reader.readLine()) != null) {
String[] tokens = line.split(",");
if (tokens.length == 3) {
String productName = tokens[0].trim();
String supermarket = tokens[1].trim();
String shelf = tokens[2].trim();
Product product = new Product(productName, supermarket, shelf);
productList.add(product);
}
}
updateListView();
Toast.makeText(MainActivity.this, "Dati caricati dal CSV", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(MainActivity.this, "Errore nel caricamento del CSV", Toast.LENGTH_SHORT).show();
}
} else {
// Crea un file CSV vuoto se non esiste
saveToCsv();
}
}
}
I singoli componenti del layout vengono richiamati nel codice tramite il loro id col metodo findViewById. I Componenti Spinner che rappresentano caselle di scelta devono essere riempiti tramite un array dichiarato in res --> values --> strings.xml e assumono il seguente aspetto :
<string-array name="scaffali">
<item>Acqua</item>
<item>Altro</item>
<item>Biscotti</item>
<item>Carne</item>
<item>Casa</item>
<item>Colazione</item>
<item>Condimenti</item>
<item>Detersivi</item>
<item>Dolcino</item>
<item>Frigo</item>
<item>Frutta e Verdura</item>
<item>Igiene</item>
<item>Latticini</item>
<item>Olio aceto passate</item>
<item>Pane</item>
<item>Pasta</item>
<item>Pesce</item>
<item>Sacchetti</item>
<item>Succhi</item>
<item>Surgelati</item>
<item>Vino</item>
</string-array>
Nel codice Java tale array si richiama con R.array.scaffali. La classe java Product rappresenta un singolo prodotto (supermercato, scaffale, nome) ed è contenuta nel package Utility che occorre creare.