9.16: Sviluppiamo un’app per la gestione della lista della spesa: la visualizzazione della lista

Condividi su:

La nostra app è finalmente in grado di popolare il database salvando i vari item che l’utente aggiunge, ma non è ancora in grado di visualizzare l’intera lista. In questo articolo vedremo come sfruttare la RecyclerView.




ListActivity è l’activity che abbiamo deciso di sfruttare per la visualizzazione di tutti gli item salvati. Abbiamo già predisposto il suo layout per ospitare il widget della RecyclerView, non ci resta da fare altro che aggiungere tutto il codice necessario.

Il codice

Vediamo l’intero file e poi procediamo alla sua spiegazione:

public class ListActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecyclerViewAdapter recyclerViewAdapter;
    private List<ShoppingItem> shoppingList;
    private List<ShoppingItem> listItems;
    private DatabaseHandler db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
//                        .setAction("Action", null).show();
            }
        });

        db = new DatabaseHandler(this);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerViewID);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        shoppingList = new ArrayList<>();
        listItems = new ArrayList<>();

        shoppingList = db.getAllShopping();

        for (ShoppingItem i : shoppingList){
            ShoppingItem item = new ShoppingItem();

            item.setId(i.getId());
            item.setName(i.getName());
            item.setQuantity(getResources().getString(R.string.quantity) + i.getQuantity());
            item.setDateItemAdded(getResources().getString(R.string.added_on) + i.getDateItemAdded());

            listItems.add(item);
        }

        recyclerViewAdapter = new RecyclerViewAdapter(this, listItems);
        recyclerView.setAdapter(recyclerViewAdapter);
        recyclerViewAdapter.notifyDataSetChanged();
    }

}

Spiegazione

Per prima cosa dichiariamo tutti i field necessari, cioè uno per la RecyclerView; uno per il suo adapter; uno per l’handler del database e due per la lista di item.

Sfruttiamo due oggetti per la lista poiché in uno salviamo quella estrapolata dal database, nel secondo modifichiamo leggermente questa aggiungendo delle etichette esplicative alla quantità e alla data di salvataggio.

All’interno del “onCreate()” non ci curiamo del codice già presente e istanziamo l’handler del database. Facciamo la stessa cosa con la RecyclerView abbinandola al suo widget nel layout. Con l’apposito metodo rendiamo fissa la dimensione di tutte le view degli item e successivamente settiamo il layout manager della RecyclerView scegliendo un LinearLayoutManager in modo da avere una vera e propria lista. Se avete dubbi su quanto fatto finora date un’occhiata agli articoli dedicati.

Procediamo con l’istanziazione delle due liste e nella prima di queste memorizziamo l’intero contenuto della tabella del database grazie al getter che abbiamo predisposto nel suo handler.

Volendo modificare gli oggetti di questa lista li scorriamo tutti tramite un ciclo. Ad ogni iterazione istanziamo un nuovo item e memorizziamo all’interno dei suoi field le varie informazioni prelevate dalla lista, sfruttando ovviamente i vari getter e setter. La modifica consiste nel trasformare il campo quantità da mero numero a qualcosa del tipo “Quantità: x” e il campo data in “Aggiunto il: data”. Una volta costruito l’item modificato lo salviamo nella seconda lista.
Se non vi interessa potete risparmiarvi questo passaggio e l’oggetto aggiuntivo.

Abbiamo tutto il necessario, quindi non resta che istanziare l’adapter settarlo sulla RecyclerView.

L’elemento di novità consiste nella chiamata al metodo “notifyDataSetChanged()” dell’adapter. Questo semplicemente notifica che il set di dati è cambiato, quindi il layout manager viene forzato ad aggiornare le view visibili.



Anche con questo articolo abbiamo finito, potete tranquillamente provare l’app e testarne il funzionamento, poiché passo dopo passo si completa sempre più. Nel prossimo articolo predisporremo un activity di dettaglio da richiamare al click su uno degli item della lista.

Condividi su:

label, ,

About the author