2017-08-22 23 views
0

Je n'ai aucune difficulté à créer plusieurs porte-vues dans une vue recyclée. Le problème c'est que je le détermine en positionnant les en-têtes et les items.Comment déterminer le positionnement pour RecyclerView avec plusieurs porte-vues

Je crée une application de galerie et je veux avoir les noms de mes albums en en-tête et mettre 8 images pour chaque album. Donc, vous auriez un en-tête avec le titre de l'album, puis 8 images de cet album. puis l'en-tête suivant avec le titre de l'album et 8 photos de cet album. Et continuez avec ce schéma. S'il y a moins de 8 images, je veux les laisser vides jusqu'à ce que l'en-tête suivant commence.

J'ai deux ArrayList dont je reçois mes données. Albums et médias.

J'essaie de définir le type dans getItemViewType de ma carte, mais je n'arrive pas à comprendre comment les définir comme mentionné ci-dessus. Ce qui m'embrouille, c'est d'essayer de positionner avec plusieurs arrailistes et un nombre inconnu d'images pour chaque album.

Encore une fois, il ne s'agit pas d'une autre question comme celles que j'ai vues à propos de la configuration de plusieurs vues dans une vue recyclée. J'ai ce concept. Mon problème est de déterminer le positionnement pour les détenteurs de vue.

Voici comment créer et lier mes vues cherchent à donner un contexte

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == ALBUM_TYPE) { 
     return new AlbumHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view, parent, false)); 
    } else if (viewType == HEAD_TYPE) { 
     return new HeadHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.header_text, parent, false)); 
    } else { 
     return new MediaHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_photo, parent, false)); 
    } 

} 

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof AlbumHolder) { 
     Album m = albums.get(position); 
     ((AlbumHolder)holder).bindView(m, position); 
    } else if (holder instanceof HeadHolder) { 
     if (sortingMode == SortingMode.FOLDER) { 
      Album m = albums.get(position); 
      ((HeadHolder)holder).bindView(m.getName(), position); 
     } else { 
      String m = sortListYear.get(position); 
      ((HeadHolder)holder).bindView(m, position); 
     } 

    } else { 
     Media m = media.get(position); 
     ((MediaHolder)holder).bindView(m, position); 
    } 

} 

Le ALBUM_TYPE ne sert à cette question que je pose. Juste le HEAD_TYPE et MEDIA_TYPE.

Répondre

0

Tenir compte 2 objets ici des médias et chef

Ce que vous pouvez faire est de créer une autre ArrayList et ajoutez les données (médias ou de la tête) dans cette nouvelle arraylist (Object) dans l'ordre que vous voulez qu'il soit affiché/utilisé dans le recyclerview.

ArrayList<Object> objList = new ArrayList<>(); 
objList.add(new Head("Header1"); 
objList.add(new Media("/img1")); 
objList.add(new Media("/img2")); 
objList.add(new Media());//no image, for blank entry 
objList.add(new Head("Header2")); 
objList.add(new Media("/img3")); 
objList.add(new Media()); 
objList.add(new Media()); 

vous pouvez utiliser instanceof getItemViewType. Ici, la position est déterminée par l'index de objList.

+0

J'aime cette approche, mais j'ai du mal à créer l'objList.J'essaye une boucle imbriquée mais ne peux pas sembler la faire fonctionner. des conseils sur la façon dont il aurait l'air. Mes médias ont une méthode pour voir à quel album (tête) il appartient. – Bignadad

+0

pouvez-vous partager du code sur la façon dont vous essayez de créer objList? De cette façon, il serait plus facile à suggérer. – singhnikhil

0

Vous avez deux ArrayList distincts pour les médias et l'album.

ArrayList<Object> mediaList = new ArrayList(); 

ArrayList<Object> albumList = new ArrayList(); 

Dans votre scénario, vous devez calculer la position.

Permet de résoudre ce problème avec un exemple. Dans votre méthode getItemViewType vous avez défini le média doit être dans le premier ensemble de liste suivi par album.i.e., La taille totale de recyclerview est de 10 en ce que 8 premières lignes seront médias et les deux dernières lignes seront album.

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
int currentPosition = 0; 
if ((mediaList.size() - 1) >= position) { 
//Since media list is loaded first... 
    currentPosition = position; 
} else { 
    //Since we are loading the album next we need to take from here... 
    currentPosition = position - mediaList.size(); 
} 


if (holder instanceof MediaHolder) { 
     Media m = media.get(currentPosition); 
     ((MediaHolder)holder).bindView(m, currentPosition); 
    } else if (holder instanceof AlbumHolder) { 
     Album m = albums.get(currentPosition); 
     ((AlbumHolder)holder).bindView(m, currentPosition); 
    } 

} 

Si vous avez une ArrayIndexOutOfBound Exception dans la ligne ci-dessous,

currentPosition = position - mediaList.size(); 

font de bien vouloir le changement ci-dessous,

currentPosition = (position - mediaList.size()) - 1; 

Pour plus d'informations, vous pouvez consulter ce link, dans cet exemple nous avons mis en place un pied de page et pour cela aussi j'ai calculé la position.

J'espère que c'est utile :)

+0

Impossible de comprendre à quoi ressemblera la méthode getItemViewType pour que cela fonctionne. Aussi ce serait 8 médias par album. Vous dites "la taille totale de recyclerview est de 10 en ce que les 8 premières lignes seront des médias et les deux dernières rangées seront des albums" ce qui ne serait pas correct. si les deux dernières lignes sont en album, il devrait y avoir 16 lignes de média. – Bignadad