Introduciamo la classe Todo ed eliminiamo correttamente le task
Nella Parte 1 abbiamo creato una semplice Todo App utilizzando:
SQLiteper salvare i datiListViewper mostrarliArrayAdapterper collegare dati e interfaccia
In quella versione, però, stavamo lavorando solo con ArrayList<String>.
Questo approccio funziona, ma ha un limite importante:
Non abbiamo accesso all’ID della task salvata nel database.
Senza ID non possiamo gestire correttamente operazioni come eliminazione o modifica.
In questa seconda parte miglioreremo la struttura dell’app:
- Creiamo una classe
Todo - Modifichiamo il
DatabaseHelper - Aggiorniamo la
MainActivity - Implementiamo l’eliminazione corretta tramite ID
Creiamo la classe Todo
Creiamo un nuovo file: Todo
package com.samuelefilincieri.todoapp;
public class Todo {
private int id;
private String task;
public Todo(int id, String task) {
this.id = id;
this.task = task;
}
public int getId() {
return id;
}
public String getTask() {
return task;
}
@Override
public String toString() {
return task;
}
}
Perché override di toString()?
Perché la ListView usa automaticamente toString() per mostrare l’oggetto.
In questo modo possiamo usare ArrayAdapter<Todo> senza modificare il layout.
Aggiorniamo il DatabaseHelper
Ora modifichiamo DatabaseHelper per lavorare con oggetti Todo invece che con String.
Metodo getAllTasks aggiornato
public ArrayList<Todo> getAllTasks() {
ArrayList<Todo> list = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
if (cursor.moveToFirst()) {
do {
int id = cursor.getInt(0);
String task = cursor.getString(1);
list.add(new Todo(id, task));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return list;
}
Metodo deleteTask tramite ID
public void deleteTask(int id) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NAME, "id=?", new String[]{String.valueOf(id)});
db.close();
}
Adesso l’eliminazione è precisa e sicura.
Aggiorniamo la MainActivity
Ora modifichiamo la MainActivity per usare ArrayList<Todo>.
Variabili aggiornate
ArrayAdapter<Todo> adapter;
ArrayList<Todo> todoList;
onCreate aggiornato
db = new DatabaseHelper(this);
todoList = db.getAllTasks();
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, todoList);
listViewTodo.setAdapter(adapter);
Pulsante Aggiungi aggiornato
Modifichiamo l’evento del bottone:
buttonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String taskText = editTextTodo.getText().toString();
if (!taskText.isEmpty()) {
db.addTask(taskText);
// Ricarichiamo dal database per ottenere anche l'ID
todoList.clear();
todoList.addAll(db.getAllTasks());
adapter.notifyDataSetChanged();
editTextTodo.setText("");
}
}
});
Eliminare una Task con Long Click
Ora aggiungiamo l’eliminazione tramite pressione prolungata:
listViewTodo.setOnItemLongClickListener((parent, view, position, id) -> {
Todo selectedTask = todoList.get(position);
db.deleteTask(selectedTask.getId());
todoList.remove(position);
adapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this,
"Task eliminata",
Toast.LENGTH_SHORT).show();
return true;
});
Cosa Succede Ora?
Quando tieni premuto su una task:
- Recuperiamo l’oggetto
Todo - Otteniamo il suo ID
- Lo eliminiamo dal database
- Lo rimuoviamo dalla lista
- Aggiorniamo l’interfaccia
Il tutto in modo corretto e professionale.
Risultato Finale
Rispetto alla Parte 1 abbiamo:
- Struttura dati più professionale
- Gestione corretta dell’ID
- Eliminazione precisa dal database
- Codice più scalabile
Ora la nostra Todo App è strutturata correttamente e pronta per evolvere.
Conclusione
Nel prossimo articolo potremo aggiungere:
- Modifica di una task
- Task completate
- RecyclerView
- Material Design
Lascia un commento