changes not being applied in recyclerView getViewTreeObserver

14 Views Asked by At

I am creating a blog like thing for which i am adding cards for each blog into recyclerView. I want a readmore button to appear when the body of blog exceeds a specific number of lines. The code is working for the cards loaded and displayed on screen initially but when i scroll down, the cards that were out of screen (visible on scrolling) doesnt get readMore button and neither body text truncated

import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

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

    private ArrayList<ArrayList<String>> dataList;

    public newsArticlesViewAdapter(ArrayList<ArrayList<String>> dataList) {
        this.dataList = dataList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_articles_card_layout, parent, false);
        return new ViewHolder(view);
    }

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

        List<String> data = dataList.get(position);

        holder.title.setText(data.get(0));
        holder.body.setText(data.get(1));

        holder.body.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                holder.body.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                int maxLines = 8;

                if (holder.body.getLineCount() > maxLines){
                    holder.body.setEllipsize(TextUtils.TruncateAt.END);
                    holder.body.setMaxLines(maxLines);
                    holder.readMore.setVisibility(View.VISIBLE);
                    holder.readMore.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (holder.readMore.getText().toString().equals("Read More")) {
                                holder.body.setMaxLines(Integer.MAX_VALUE);
                                holder.readMore.setText("Read Less");
                            }else{
                                holder.body.setMaxLines(maxLines);
                                holder.readMore.setText("Read More");
                            }
                        }
                    });
                }

            }
        });
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView title, body, readMore;
        ProgressBar progressBar;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.title);
            body = itemView.findViewById(R.id.body);
            readMore = itemView.findViewById(R.id.readMore);
            progressBar = itemView.findViewById(R.id.progressBar);

        }
    }
}
0

There are 0 best solutions below