Imprimir este capítuloImprimir este capítulo

Livro 3 - Projeto Agenda de Contatos - Parte 3

4. ViewModel e vinculação de dados

4.1. MainViewModel

Implementação da MainViewModel

A MainViewModel deve ser implementada para armazenar uma lista de contatos. Para tanto, usamos um elemento LiveData<List<Contact>> de forma que seja armazenada uma lista de contatos usando a classe LiveData. Durante a criação da ViewModel, é solicitado ao repositório da aplicação a lista de contatos. Como esses dados são representados por uma LiveData o fragmento pode solicitar esses dados com o método getAllContacts e configurar a observação desses dados para que mudanças no banco de dados reflitam nos dados apresentados na interface gráfica.

package ...

import android.app.Application;

import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

import java.util.List;

import br.com.bcalegaro.agendacontatos.data.Contact;
import br.com.bcalegaro.agendacontatos.data.ContactsRepository;

public class MainViewModel extends AndroidViewModel {
private LiveData<List<Contact>> mAllContacts;
private ContactsRepository mRepository;

public MainViewModel (Application application) {
super(application);
mRepository = new ContactsRepository(application);
mAllContacts = mRepository.getAllContacts();
}

public LiveData<List<Contact>> getAllContacts() { return mAllContacts; }
}

Vinculação dos dados no MainFragment

Para fazer a vinculação dos dados da ViewModel ao fragmento vamos modificar o método onActivityCreated de MainFragment da seguinte forma:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
// configura a observação da lista de contatos para atualizar a lista
// quando detectada uma mudança
mainViewModel.getAllContacts().observe(getViewLifecycleOwner(), new Observer<List<Contact>>() {
@Override
public void onChanged(@Nullable final List<Contact> contacts) {
// Atualiza a lista de contatos do adaptador
contactsAdapter.setContacts(contacts);
}
});
}

Ao fazer essa configuração, configuramos que mudanças na lista de contato disparem automaticamente a atualização dos dados no adaptador e, por tanto, nos dados exibidos na interface gráfica.