Em aplicações de gerenciamento de dados, como um controle financeiro, a capacidade de visualizar e adicionar registros é fundamental, mas a gestão completa exige que o usuário possa remover entradas incorretas ou desnecessárias. Uma abordagem comum e intuitiva no Android para essa funcionalidade é o uso do evento de clique longo (long click) em componentes de lista.
Implementando a Exclusão com Confirmação
Para evitar exclusões acidentais, utilizamos um AlertDialog que solicita a confirmação do usuário antes de proceder com a remoção do registro no banco de dados SQLite. O exemplo abaixo demonstra como configurar o OnItemLongClickListener em uma ListView:
listViewRegistros.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
new AlertDialog.Builder(ActivityPrincipal.this)
.setTitle("Remover Registro")
.setMessage("Tem certeza que deseja apagar este item?")
.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Obtendo o ID real do banco de dados através do adaptador
String idAlvo = String.valueOf(meuAdaptador.getItemId(position));
SQLiteDatabase db = dbHelper.getWritableDatabase();
// Executando a remoção baseada na chave primária
db.delete("tb_financas", "_id = ?", new String[]{idAlvo});
Toast.makeText(getApplicationContext(), "Excluído com sucesso", Toast.LENGTH_SHORT).show();
// Método para recarregar os dados na tela
recarregarInterface();
}
})
.setNegativeButton("Cancelar", (dialog, which) -> dialog.dismiss())
.create()
.show();
return true;
}
});
Ajustando o Adaptador para Identificação de Registros
Para que a exclusão funcione corretamente, o método getItemId do seu adaptador customizado deve retornar o ID real da linha no banco de dados, em vez de apenas a posição do item na lista visual. Geralmente, os objetos de modelo (POJOs) carregam esse ID. Veja como sobrescrever esse método:
@Override
public long getItemId(int position) {
// Converte o ID armazenado no objeto da lista para o tipo long
return Long.parseLong(listaObjetos.get(position).getIdBanco());
}
Atualização Dinâmica da Interface
Após a exclusão de registros, especialmente quando há dependências entre diferentes telas da aplicação, pode ser necessário garantir que a interface reflita o estado mais atualizado do banco de dados de forma automática. Uma das técnicas para realizar atualizações periódicas envolve o uso de Handler e Runnable para criar um ciclo de refresh.
private Handler refreshHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
executarSincronizacao();
}
};
private Runnable refreshRunnable = new Runnable() {
@Override
public void run() {
while (true) {
try {
// Define o intervalo de atualização (ex: 500ms)
Thread.sleep(500);
refreshHandler.sendEmptyMessage(0);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
};
private void executarSincronizacao() {
// Lógica para remontar a View ou atualizar o Adaptador
initComponentes();
}
Ao integrar o mecanismo de exclusão com a atualização constante da UI, a aplicação garante que o usuário sempre visualize o estado real dos dados, removendo inconsistências visuais imediatamente após a manipulação do banco de dados.