web-dev-qa-db-fra.com

Comment empêcher les éléments de se dupliquer lors du défilement de la vue du recycleur

J'ai créé une ligne dans la vue Recycler et à l'intérieur de celle-ci, j'ai gonflé deux lignes ou plus, mais lorsque je fais défiler les éléments sont de nouveau utilisés. feed et leurs commentaires. Pour les commentaires, je dois gonfler les dispositions pour les afficher sous les flux pour lesquels la méthode getCommentInflaterView est créée.

Mais la vue créée à l'aide de getCommentInflaterView () est dupliquée . 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) 
        }


    }
}
13
Ravi Yadav

Ignorez ces deux méthodes dans l’adaptateur.

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

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

dans votre classe d'adaptateur AllFeedsAdapter, vous devez redéfinir la méthode:

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

J'ai travaillé Effacer le contenu avant de charger les données dans la vue Recycler

listOftrailers.clear ();

0
gauravsngarg