Livro 3 - Projeto Agenda de Contatos - Parte 2
5. Manipulação de Listas
5.2. Classe ContactsAdapter
Ao se lidar com listas de itens no Android um adaptador deve ser implementado, ele é o responsável por vincular uma lista de valores aos elementos gráficos de uma ListView. No caso específico de uma RecyclerView o adaptador deve ser implementado com a herança da classe RecyclerView.Adapter. Neste projeto, criamos o ContactsAdapterpara preencher o conteúdo da RecyclerView da aplicação.
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactsViewHolder> {
// interface implementada por ContactsFragment para responder
// quando o usuário toca em um item na RecylerView
public interface ContactClickListener {
void onClick(int contactID);
}
public class ContactsViewHolder extends RecyclerView.ViewHolder {
private final TextView contactItemView;
private int contactID;
private ContactsViewHolder(View itemView) {
super(itemView);
contactItemView = itemView.findViewById(android.R.id.text1);
// anexa receptor a itemView
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
clickListener.onClick(contactID);
}
});
}
// configura o identificador de linha do banco de dados para o contato
public void setContactID(int contactID) {
this.contactID = contactID;
}
}
private List<Contact> mContacts; // Cached copy of contacts
private final ContactClickListener clickListener;
// construtor
public ContactsAdapter(ContactClickListener clickListener) {
this.clickListener = clickListener;
}
@Override
public ContactsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// infla o layout android.R.layout.simple_list_item_1
View view = LayoutInflater.from(
parent.getContext()).inflate(
android.R.layout.simple_list_item_1,
parent, false);
return new ContactsViewHolder(view);
}
@Override
public void onBindViewHolder(ContactsViewHolder holder, int position) {
if (mContacts != null) {
Contact current = mContacts.get(position);
holder.contactItemView.setText(current.getName());
holder.setContactID(current.getId());
}
}
void setContacts(List<Contact> contacts){
mContacts = contacts;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (mContacts != null)
return mContacts.size();
else return 0;
}
}
Dentro desta classe também serão definidos os seguintes elementos:
- Interface ContactClickListener
- Interface que a classe ContactsFragment implementa para ser notificada quando o usuário toca em um contato da RecyclerView
- Cada item da lista, pode disparar esse evento. Ao se clicar em um contato, o método deve notificar a MainActivity que um contato foi selecionado, para que a atividade principal possa exibir o componente DetailFragment
- Classe ContactsViewHolder
- Classe para usar o padrão ViewHolder. Utiliza a herança do elemento RecyclerView.ViewHolder.
- ViewHolder é um elemento que armazena os dados do item em cada posição da lista. No caso do contato, cada ViewHolder vai armazenar o ID do contato e assimilar a ação onClick indicando esse valor de ID.
- Método onCreateViewHolder
- Método que infla a interface gráfica usando um layout predefinido no Android. O android.R.layout.simple_list_item_1, pode ser usado para mostrar listas simples, com apenas um texto descrevendo o item.
- Neste aplicativo essa template é o suficiente pois iremos apenas mostrar o nome do Contato na lista.
- Método onBindViewHolder
- Esse método usa o valor da posição atual, position, na lista para identificar o contato correto a partir de uma lista de contatos armazenada no adaptador.
- Os dados do contato encontrado são repassados a ViewHolder informando o nome do contato para exibir como item da lista ao mesmo tempo que se armazena o ID do contato no ViewHolder.
- Observe que é necessário anexar o valor do ID do contato a ViewHolder pois a mesma usará esse valor para encaminhar a ação ao se clicar nesse contato específico.
- Método setContacts
- Esse método anexa uma nova lista de contatos ao adaptador e sinaliza para a lista ser redesenhada através do método notifyDataSetChanged.