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);
}
}
}