J'ai besoin d'ajouter une petite bande entre les éléments d'un RecyclerView. Cette bande peut venir après un nombre différent d'éléments dans une liste. Cela doit être fait de manière dynamique ... Je dois implémenter quelque chose comme ce que FitBit a fait:
J'ai aussi besoin de la première rangée, celle qui dit "Cette semaine" pour rester en haut, même si la page défile vers le bas.
Utiliser Librairie StickyHeadersRecyclerView
C'est très facile à utiliser
Vous devez utiliser le concept de différents types de vues en utilisant getItemViewType (int) . Ensuite, sur onCreateViewHolder (ViewGroup, int) vous pouvez vérifier le type à gonfler/créer.
Exemple:
@Override
public int getItemViewType(int position) {
// you should return the view type, based on your own dynamic logic
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
// handle each view type accordingly
}
}
Vous pouvez utiliser le concept de plusieurs types de vues dans votre RecyclerView
, en utilisant simplement getItemViewType()
, et gérer le paramètre viewType dans onCreateViewHolder()
.
Par exemple, vous pouvez utiliser le modèle ci-dessous:
public class Data{
int field1;
float filed2;
int rowType // 1,2,2,...N this will fill by you whenever you will
//creating arraylist for your recyclerview
}
public class Custome Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<Data> mItems;
class ViewHolderRowType1 extends RecyclerView.ViewHolder {
...
}
class ViewHolderRowType2 extends RecyclerView.ViewHolder {
...
}
....
class ViewHolderRowTypeN extends RecyclerView.ViewHolder {
...
}
@Override
public int getItemViewType(int position) {
return mItems.get(position).rowType;
//or
//return positon%2; // This will based on your condition
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: return new ViewHolderRowType0(...);
case 1: return new ViewHolderRowType1(...);
...
case N: return new ViewHolderRowTypeN(...);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) {
//Just check which view type is going to bind and then fill the data accordingly in your rows
if(vh instanceof ViewHolderRowType1){
// Fill the data for first view type
} else if (vh instanceof ViewHolderRowType2) {
// Fill the data for second view type
} else if (vh instanceof ViewHolderRowTypeN){
// Fill the data for Nth view type
}
}
Pour votre post-it "this view faible", vous pouvez l'ajouter en haut de votre RecyclerView
puis le manipuler par scroll Event of RecyclerView
Si vous voulez le faire de manière "correcte", sans piratage, vous devez écrire votre propre LayoutManager et gérer ces cas à la main. Ce n'est pas aussi difficile que cela en a l'air, mais cela demandera quelques efforts.