12
Desenvolvedora Android Criando uma lista heterogênea com recyclerview e viewtypes Paula Rosa

Recyclerview view types

Embed Size (px)

Citation preview

Page 1: Recyclerview view types

Desenvolvedora Android

Criando uma lista heterogênea com recyclerview e viewtypes

Paula Rosa

Page 2: Recyclerview view types

RecyclerView

RecyclerView

LayoutManager Adapter Dados

• Somente a RecyclerView atualiza o adapter.

• O LayoutManager cuida de calcular o layout para saber quantos itens caberão a cada scroll

• Quando a lista sofre um scroll, a RecyclerView avisa o LayoutManager e ele escrola a lista.

• Aumenta consideravelmente a performance da lista, pois pode alterar somente uma parte (range) da lista

• Animações mais fáceis de codificar;

Page 3: Recyclerview view types

Lista Heterogêna

• Quando se precisa inflar mais de um tipo de layout, e que tenham formato de lista

• Quando uma lista precisa de header

• Quando precisar de muita performance

Quando usar?

Page 4: Recyclerview view types

ViewTypes• É uma forma do android entender que há vários tipos de views na

recyclerview

• Sendo assim, se cria um ViewHolder para cada tipo de View (ViewType)

• O bind das views é feito baseado também no ViewType

Page 5: Recyclerview view types

Exemplo

ContactListCategoria

Family Friends Work

Page 6: Recyclerview view types

if(!familyList.isEmpty()) { recyclerData.add(null); recyclerData.addAll(familyList);} else if(!friendsList.isEmpty()) { recyclerData.add(null); recyclerData.addAll(friendsList);}

private List<Contact> recyclerData = new ArrayList<>();

for(int i = 0; i < contactList.size(); i++) { if(contactList.get(i).getCategory() == Contact.Category.FAMILY) { familyList.add(contactList.get(i)); } else if(….) { //TODO }

Separa Listas

Cria uma lista de dados

Page 7: Recyclerview view types

getItemCount() —> return int

Tipos diferentes de views

• Retorna tamanho total da lista (itens da lista + headers)

• Ou retorna o tamanho da lista de dados (recyclerData)@Overridepublic int getItemCount() { return recyclerData.size();}

Page 8: Recyclerview view types

getItemViewType(int position) —> return int

• Retorna o viewType desejado para determinada posição@Overridepublic int getItemViewType(int position) { if (position == 0) { return VIEW_TYPE_CATEGORY; } else if (position == familyList.size() +1) { return VIEW_TYPE_CATEGORY; } else if (…){ (…) }}

@Overridepublic int getItemViewType(int position) { if (recyclerData.get(position) == null) { return VIEW_TYPE_CATEGORY; } else { return VIEW_TYPE_CONTACT_LIST; }}

Page 9: Recyclerview view types

ViewHolder • Cria ViewHolder para cada tipo de View

static class ViewHolderContactList extends BaseViewHolder {

TexView contactName;

public ViewHolderContactList(View view) { super(view); contactName = (TextView) view.findViewById(R.id.name); (…) }}

BaseViewHolder -> Classe Abstrata que herda de RecyclerView.ViewHolder

Page 10: Recyclerview view types

onCreateViewHolder(ViewGroup parent, int viewType) —> return BaseViewHolder

• Retorna o viewType desejado para determinada posição

@Overridepublic BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder; if (viewType == VIEW_TYPE_CATEGORY) {

View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.view_header_category, parent, false);

viewHolder = new ViewHolderCategory(view);

} else { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.view_item_contact, parent, false);

viewHolder = new ViewHolderContactList(view); }}

Page 11: Recyclerview view types

onBindViewHolder(BaseViewHolder parent, int position) —> return int

• Seta os valores de cada view em determinada posição@Overridepublic void onBindViewHolder(BaseViewHolder parent, int position) {

BaseViewHolder viewHolder; if (getItemViewType(position) == VIEW_TYPE_CATEGORY) { ViewHolderCategory viewHolderCategory = (ViewHolderCategory) holder; (…) viewHolderCategory.categoryName.setText(categoria);

} else { ViewHolderContactList viewHolderContact = (ViewHolderContactList) holder; (…) viewHolderContact.contactName.setText(recyclerData.get(position).getName); }}

Page 12: Recyclerview view types

finaly {}• https://github.com/paulacr/ViewTypesRecyclerView

• https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView