0

J'utilise les éléments suivants code dans Adapter classe à show data dans un RecyclerView, mais maintenant je voudrais présenter les données d'une autre ArrayList dans un même RecyclerView (à some positions comme: 1ère position et 6ème position) en utilisant une disposition différente.données montrent RecyclerView de 2 mises en page différentes

Cette mise en page différente (supposons: another_layout.xml) contient 2 TextViews et une image, veulent aussi mettre en œuvre cliquez sur écouteur pour que la mise en page trop ..

@Override 
    public PlaylistCardAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // inflate a card layout 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.youtube_video_card, parent, false); 
     // populate the viewholder 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

Répondre

1

RecyclerView pour plus d'une mise en page
1. Remplacer méthode getItemViewType (position int)
J'ai deux par exemple mises en page Présentation1 et layout2.I veulent Présentation1 en haut puis Layout2. Donc getItemViewType serait quelque chose comme ça

@Override 
public int getItemViewType(int position) { 

    if(position == 0){ //for layout1 
     return 1; 
    }else{ 
     return 2;  //for layout2 
    } 
} 

2. Différents viewholder pour chaque mise en page comme celui-ci

class ViewHolder_LayoutOne extends RecyclerView.ViewHolder{ 
    TextView name; 
    //Constructor 
} 

class ViewHolder_LayoutTwo extends RecyclerView.ViewHolder{ 
    TextView name; 
    //Constructor 
} 

3. Gonflez différentes mises en page en fonction de la position

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    RecyclerView.ViewHolder vh = null; 
    if(viewType == 1){ 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_layout_one,parent,false); 
     vh = new MyViewHolder_LayoutOne(view); 
    }else if(viewType == 2){ 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_layout_two,parent,false); 
     vh = new MyViewHolder_LayoutTwo(view); 
    } 
    return vh; 
} 

4. Bind votre vues selon la position

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 


    switch(getItemViewType(position)){ 

     case 1: //for layout 1 
      ((ViewHolder_LayoutOne)holder).name.setText(""); 
      break; 

     case 2:// for layout 2 
      ((ViewHolder_LayoutTwo)holder).name.setText(""); 
      break; 
    } 
} 

5.Now méthode GetItemCount() le plus important // Retourne le nombre de vues

@Override 
public int getItemCount() { 
    return toptitles.length + 1; 
    // as i have only layout at the top and the remaining size equals the length of the array toptitles.So the overall length would be 
    //number of views of layout1 + number of views of layout2 
} 

Hope this helps !!!

+0

J'ai essayé comme vous m'avez mentionné, mais je reçois des problèmes/erreurs à plusieurs endroits dans ma classe Adapter, pouvez-vous faire des modifications dans ma classe Adapter existante ... celle que j'ai posté ci-dessus – Sophie

+0

jetez un coup d'oeil à ce projet d'application de film populaire udacity https: // github .com/gosemathraj/Cinéma/blob/maître/app/src/principal/java/com/gosemathraj/cinema/adapteurs/RecyclerViewCustomAdapter.java –

+0

pour chaque 3e position votre getItemViewType vérifie juste la position comme ceci if ((position + 1) % 4 == 0) {return 1;} –

0

Vous pouvez remplacer getItemViewType et utiliser ViewHolder différent pour une disposition différente.

0

Vous devez passer outre getItemViewType comme ceci:

@Override 
    public int getItemViewType(int position) { 
     Add your condition and return viewType(Constant) 
    } 

Maintenant, vérifiez viewType et retrun viewHolder en conséquence.

@Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      if (viewType == VIEWHOLDER1) { 
       View v = LayoutInflater.from(activity).inflate(R.layout.layout1, parent, false); 
       return new ViewHolder1(v); 
      }else if(viewType == VIEWHOLDER2){ 
       View v = LayoutInflater.from(activity).inflate(R.layout.layout2, parent, false); 
       return new ViewHolder2(v); 
      } 
     } 

maintenant, Vérifiez par exemple de viewHolder

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (holder instanceof ViewHolder1) { 
      Show values in UI accordingly. 
     }else if(holder instanceof ViewHolder2){ 
      Show values in UI accordingly. 
     } 
} 
+0

ohk ... getItemViewType (...) exactement ce que j'ai besoin d'écrire ...ma logique est d'afficher des données de disposition différente en 1ère et 6ème position – Sophie

+0

Dans votre cas, la position de retour de getItemViewType et dans onCreateViewHolder vérifient viewType en utilisant le commutateur if-else OU et en conséquence retournent ViewHolder. –

+0

J'ai essayé de la façon dont vous m'avez mentionné, mais je reçois des problèmes/erreurs à plusieurs endroits dans ma classe Adapter, pouvez-vous faire des modifications dans ma classe Adapter existante ... laquelle j'ai posté dessus – Sophie

0

Vous pouvez définir le type que vous voulez dans getItemViewType (position int) avec la mise en page que vous voulez. Et onCreateViewHolder vous pouvez vérifier viewType et gonfler la ligne en conséquence.

here is an example.