Upload
paula-caroline-da-rosa
View
75
Download
0
Embed Size (px)
Citation preview
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