2

J'ai un RecyclerView avec un adaptateur personnalisé qui étend RecyclerView.AdapterRecyclerView Affichage des données aléatoires

Je crée LinearLayout avec Textview à l'exécution et le gonfler dans chaque rangée de RecyclerView

Par exemple, 1 ère Ligne de RecyclerView aura 2 ou 3 Textview créé à l'exécution, la 2ème rangée aura 2 ou 3 textviews créés à l'exécution, la 3ème rangée aura quelques textviews ... et ainsi de suite ...

Son fonctionnement presque Préfet si je vérifie mon journal ... Mais quand je le fais défiler vers le bas, il place juste un peu de texte dans les mauvais endroits, signifie que je reçois précédent Texte à nouveau lorsque je fais défiler vers le bas dans les mauvais endroits

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int i) { 
    //Movie movie = mItems.get(i); 
    hm2 = new HashMap<String, ArrayList<PD_Data>>(); 
    sub_rows2 = new ArrayList<PD_Data>(); 
    hm2=categories.get(i); 
    String key=hm2.keySet().toArray()[0].toString(); 
    sub_rows2=hm2.get(key); 

    Log.i(LOG_TKT,key); 

    viewHolder.textview_category.setText(key); 

    LayoutInflater inflater; 
    View new_sub_row; 

    for(int x=0;x<sub_rows2.size();x++){ 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     new_sub_row = inflater.inflate(R.layout.recyclerview_pd, null); 
     TextView heading2 = (TextView)new_sub_row.findViewById(R.id.heading2); 
     heading2.setText(sub_rows2.get(x).sub_heading); 
     Log.i(LOG_TKT,sub_rows2.get(x).sub_heading); 
     TextView detail2 = (TextView)new_sub_row.findViewById(R.id.detail2); 
     detail2.setText(sub_rows2.get(x).value); 
     Log.i(LOG_TKT, sub_rows2.get(x).value); 
     viewHolder.linearlayout_recyclerview_pd.addView(new_sub_row); 
    } 
    //viewHolder.imgThumbnail.setImageResource(movie.getThumbnail()); 
    hm2 = new HashMap<String, ArrayList<PD_Data>>(); 
    sub_rows2 = new ArrayList<PD_Data>(); 
} 

Qu'est-ce que je fais mal?

Répondre

2

Il ressort de votre question que vous n'êtes pas familier avec l'utilisation de RecyclerViews. Vous devez lire sur le sujet. Here est un bon début.

Fondamentalement, sur Bind ViewHolder() est uniquement responsable de la liaison de vos données à vos viewHolders qui détiennent vos mises en page d'article que vous communiquez sur onCreateViewHolder(). La raison en est que RecyclerView recycle vos vues afin qu'il ne doit pas créer de nouvelles vues chaque fois que vous faites défiler.

Dans votre cas, il semble que vous deviez utiliser une technique qui indique à RecyclerView d'utiliser différents viewHolders pour différents éléments. Voyez comment vous pouvez le faire here.

+0

OK, rencontré aller à travers ces liens ... –

+0

Hey @Ari J'ai parcouru les liens que vous avez fournis et réponds à ce lien. Je l'ai maintenant comment fonctionne RecyclerView et l'utilisation de getItemViewType ie, je peux fournir différentes dispositions pour différentes lignes en fonction de ma logique (à savoir, sur quelle ligne non) ... Mais je ne comprends pas comment le faire au Runtime, signifie J'ai un fichier layout.xml pour les looks de cardsView ... mais certaines lignes peuvent avoir 2 cardsView, et certaines lignes peuvent avoir plus de 2 CardsView .... alors comment faire ça .... merci de nous aider ... –

+0

Bon travail sur la lecture! Vous manquez probablement juste une chose de plus. Vous devez créer vos différents types ViewHolder avec différentes mises en page. Donc, dans votre cas, vous avez besoin d'une mise en page régulière, et une mise en page avec deux CardViews. – Ari

1

J'ai donné une réponse pour une meilleure pratique de liaison de données avec ViewHolder dans une autre question. Vous pouvez le vérifier ici RecyclerView causes issue when recycling J'espère que cela va vous aider. Cela vous résoudra bien le problème. EDIT

Avez-vous déjà résolu votre problème? Si non, considérez mon conseil. Vous connaissez le problème, n'est-ce pas? Supposons que vous créez un ViewHOlder pour l'élément 0 et y ajoutez du texte. Alors que le défilement suppose que ce ViewHolder recyclé pour le numéro de l'article 10, puis en fonction de votre code, il ajoutera de nouvelles lignes de texte avec quelques lignes de texte ajoutés pour le numéro de l'article 0. Vous pouvez résoudre comme

LayoutInflater inflater; 
View new_sub_row; 

//check here if the linear layout already has previusely added child, if yes remove them 
if(viewHolder.linearlayout_recyclerview_pd.getChildCount()>0){ 
    viewHolder.linearlayout_recyclerview_pd.removeAllViews(); 
} 
for(int x=0;x<sub_rows2.size();x++){ 
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    new_sub_row = inflater.inflate(R.layout.recyclerview_pd, null); 
    TextView heading2 = (TextView)new_sub_row.findViewById(R.id.heading2); 
    heading2.setText(sub_rows2.get(x).sub_heading); 
    Log.i(LOG_TKT,sub_rows2.get(x).sub_heading); 
    TextView detail2 = (TextView)new_sub_row.findViewById(R.id.detail2); 
    detail2.setText(sub_rows2.get(x).value); 
    Log.i(LOG_TKT, sub_rows2.get(x).value); 
    viewHolder.linearlayout_recyclerview_pd.addView(new_sub_row); 
}