1

J'ai un RecyclerView avec CardView qui affiche les données lues dans la base de données. Et cela ne pose aucun problème. Maintenant, le problème est, je veux ajouter une disposition linéaire qui contenu à la fois ImageView et TextView à l'intérieur dans le même RecyclerView, et en faire toujours le premier élément dans le RecyclerView.Comment ajouter Linear Layout pour être toujours le premier élément de RecyclerView?

Voici ce que je veux réaliser. Le premier élément de RecyclerView est toujours le Linear Layout, peu importe ce qui est différent dans CardView en dessous.

what i want to acheive

J'essaie ce tutoriel de this link il semble que gérer les différents ViewType dépend des données de la base de données, ce qui est pas ce que je veux.

Ce que je veux est

1) Cette disposition linéaire est statique

2) Toujours l'élément premier dans le RecyclerView.

Je vérifie if(index == 0) in onCreateViewHolder l'index non reconnu par le studio android.

@Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(index== 0) { 
      View feedInput = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_input, parent, false); 
      return new MyViewHolder(feedInput); 
     }else { 
      View feedItemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_item, parent, false); 
      return new MyViewHolder(feedItemView); 
     } 
    } 
+2

Pourquoi LinearLayout doit-il être dans le RecyclerView? Pouvez-vous juste le mettre au-dessus? –

+1

@MichaelVescovo Je l'ai besoin à l'intérieur de la vue de recyclage, donc il peut défiler vers le haut lorsque le recyclaged est défilé – ken

Répondre

3

Vous pouvez le faire en créant une mise en page contenant à la fois LinearLayout et CardView appelons-le both_layout. Gardez la visibilité de LinearLayout GONE.

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = (View) LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.both_layout, parent, false); 
    // Inflate both the layout. 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    if (position == 0) { 
     holder.makeFirst(); 
    } 
} 

Dans votre ViewHolder.makeFirst rendre visible LinearLayout et enlever CardView.

public void makeFirst() { 
    linearlayout.setVisibility(VISIBLE); 
    cardView.setVisibility(GONE); 
} 
+0

ce travail comme charmé – ken

+0

Vous certainement enregistrer ma journée .. merci – ken

+0

De rien. –

2

Si vous avez besoin LinearLayout d'être toujours visible, même si recyclerView est défilée, vous pouvez mettre le LinearLayout en dehors du RecyclerView. faire quelque chose comme:

<RelativeLayout 
--your attribute--> 

    <LinearLayout 
    --your attributes--> 
     //Your LinearLayout elements here 
    </LinearLayout> 

    <RecyclerView 
    --your attributes--/> 

</RelativeLayout> 

Si le LinearLayout doit être le premier élément de votre liste, vous pouvez vérifier la position dans l'adaptateur, si elle est la première position (index == 0), gonfler la mise en page avec votre LinearLayout, sinon gonfler avec la disposition de l'élément de liste que vous utilisez déjà.

EDIT:

Voici un exemple:

Il suffit de mettre en œuvre getItemViewType() et prendre soin du paramètre viewType dans onCreateViewHolder().

Alors vous faites quelque chose comme:

@Override 
public int getItemViewType(int position) { 
    if (position == 0) 
     return 1; 
    else 
     return 2; 
} 

puis à onCreateViewHolder gonfler votre disposition différente en fonction de votre viewType.

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == 1) { 
     // inflate your first item layout & return that viewHolder 
    } else { 
     // inflate your second item layout & return that viewHolder 
    } 
} 
+0

signifie que si (index == 0) 'alors gonfler ma disposition linéaire, sinon gonfler la vue de la carte, ai-je raison ?? – ken

+0

Oui, exactement :) –

+0

ok merci, laissez-moi essayer .. – ken

0

Vous devriez chercher viewType, pas index:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    class LinearViewHolder extends RecyclerView.ViewHolder { 

     public LinearViewHolder(View itemView){ 
     View feedInput = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_input, parent, false); 
      return new LinearViewHolder(feedInput); 
     } 
    } 

    class ItemViewHolder extends RecyclerView.ViewHolder { 

     public ItemViewHolder(View itemView){ 
     View feedItemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_item, parent, false); 
      return new ItemViewHolder(feedItemView); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(viewType == 0) { 
      return new LinearViewHolder(); 
     } else { 
       return new ItemViewHolder(); 
     } 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 
     if(holder.getItemViewType() == 0) { 
      LinearViewHolder linearHolder = LinearViewHolder(holder); 
     } else { 
       ItemViewHolder itemHolder = ItemViewHolder(holder); 
     } 
    } 
} 

Hope this helps.