9

Ho creato una riga all'interno della vista del riciclatore e all'interno di essa ho gonfiato due o più righe, ma quando si scorre gli elementi vengono nuovamente utilizzati. Non riesco a recuperare la vista o rimuoverli dinamicamente. Ho bisogno di un feed e dei loro commenti. Per i commenti ho bisogno di ingrandire i layout per visualizzarli sotto i feed per i quali viene creato il metodo getCommentInflaterView.Come impedire che gli elementi vengano duplicati durante lo scorrimento della vista del riciclatore

Ma la vista creata utilizzando getCommentInflaterView() viene duplicata. MyAdapterClass:

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

    ArrayList<Data> arrayListAllFeedsData; 
    Comment objComment; 


    Context context; 

    public AllFeedsAdapter(Context context, ArrayList<Data> data) { 
     this.context = context; 
     arrayListAllFeedsData = new ArrayList<>(); 
     arrayListAllFeedsData = data; 
    } 


    @Override 
    public AllFeedsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Context context = parent.getContext(); 
     LayoutInflater inflater = LayoutInflater.from(context); 

     // Inflate the custom layout 
     View post_row_view = inflater.inflate(R.layout.row_teacher_post, parent, false); 

     // Return a new holder instance 
     ViewHolder viewHolder = new ViewHolder(post_row_view); 
     return viewHolder; 
    } 

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

     holder.txtUsernamePostCreator.setText(arrayListAllFeedsData.get(position).getFull_name()); 
     holder.txtPostContent.setText(arrayListAllFeedsData.get(position).getFeed_text()); 
     holder.txtPostLikeCounter.setText(arrayListAllFeedsData.get(position).getTotal_like()); 
     holder.txtPostCommentsCounter.setText(arrayListAllFeedsData.get(position).getTotal_comment()); 

     if (arrayListAllFeedsData.get(position).getComment().size() > 0) { 


      if (arrayListAllFeedsData.get(position).getComment().size() > 2) { 
       for (int i = 0; i < 2; i++) { 

        objComment = arrayListAllFeedsData.get(position).getComment().get(i); 

        if (getCommentInflaterView(objComment) == null) { 
         holder.llCommentRowInflater.addView(getCommentInflaterView(objComment)); 
        } else { 
         holder.llCommentRowInflater.removeAllViews(); 
        } 


       } 
      } else { 
       for (int i = 0; i < arrayListAllFeedsData.get(position).getComment().size(); i++) { 

        objComment = arrayListAllFeedsData.get(position).getComment().get(i); 
        if (getCommentInflaterView(objComment) == null) { 
         holder.llCommentRowInflater.addView(getCommentInflaterView(objComment)); 

        } else { 
         holder.llCommentRowInflater.removeAllViews(); 
        } 

       } 
      } 

     } 


    } 

    private View getCommentInflaterView(Comment commentData) { 

     LayoutInflater layoutInflater = LayoutInflater.from(context); 
     View v = layoutInflater.inflate(R.layout.post_comments_list_item, null, false); 

     TextView txtCommenterUsername = (TextView) v.findViewById(R.id.txt_username_commenter); 
     TextView txtCommenterComment = (TextView) v.findViewById(R.id.txt_comments_from_commenter); 
     TextView txtCommentDuration = (TextView) v.findViewById(R.id.txt_comment_duration); 


     txtCommenterUsername.setText(commentData.getUsername()); 
     txtCommenterComment.setText(commentData.getComment()); 
     txtCommentDuration.setText(commentData.getCommentBy()); 


     return v; 

    } 

    @Override 
    public int getItemCount() { 
     return arrayListAllFeedsData.size(); 
    } 

    /** 
    * USed to create static class for all the view if listitem child 
    */ 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
     // Your holder should contain a member variable 
     // for any view that will be set as you render a row 

     public LinearLayout llParentTeacherPost, llCommentRowInflater; 

     // We also create a constructor that accepts the entire item row 
     // and does the view lookups to find each subview 
     public ViewHolder(View itemView) { 
      // Stores the itemView in a public final member variable that can be used 
      // to access the context from any ViewHolder instance. 
      super(itemView); 
      llParentTeacherPost = (LinearLayout) itemView.findViewById(R.id.ll_parent_teacher_post); 
      llCommentRowInflater = (LinearLayout) itemView.findViewById(R.id.ll_comment_row_inflater); 

      imgDpPostCreator = (ImageView) itemView.findViewById(R.id.img_dp_post_creator); 
      txtUsernamePostCreator = (TextView) 
     } 


    } 
} 

risposta

-2

Alla fine del onBindViewHolder metodo, includono: holder.itemView.setTag(arrayListAllFeedsData.get(position));

+0

La soluzione non funzionante –

3

all'interno della vostra classe di adattatori AllFeedsAdapter, è necessario eseguire l'override del metodo:

@Override 
public long getItemId(int position){ 
// return specific item's id here 
} 
+1

Si prega di essere specifici su quello che vuoi? dare un'occhiata a questo su come fare domanda http://stackoverflow.com/help/how-to-ask – selva

57

ignorare queste due Méthodes in adattatore .

@Override 
public long getItemId(int position) { 
    return position; 
} 

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

Dopo quasi 1 ora di ricerca e tentativo. Grazie mille. – Alex

+3

Funziona! Ma non so perché. Potresti spiegarlo per favore? –

+0

Grazie mille. Non ho mai pensato che questo potesse essere il motivo del problema, comunque aspettando con impazienza la spiegazione. – Syn3sthete

1

Avevo anche questo problema. Posso confermare l'aggiunta di getItemId e getItemViewType all'adattatore risolve la duplicazione delle immagini negli elementi di recyclerview, durante lo scorrimento.

@Override 
public long getItemId(int position) { 
    return position; 
} 

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

Avrei lasciato questo come commento, ma ho meno di 5 feedback.

Problemi correlati