Vai al contenuto

Sviluppare un'app in Java Android per la lista della spesa/Classe MainActivity

Wikibooks, manuali e libri di testo liberi.

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.