recyclerview view types

Post on 13-Apr-2017

75 Views

Category:

Mobile

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Desenvolvedora Android

Criando uma lista heterogênea com recyclerview e viewtypes

Paula Rosa

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;

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?

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

Exemplo

ContactListCategoria

Family Friends Work

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

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();}

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; }}

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

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); }}

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); }}

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

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

top related