RecyclerView 的 CardView 中带有省略号的可扩展和可折叠 TextView

Expandable and Collapsible TextView with Ellipsis in a RecyclerView's CardView

以编程方式在 RecyclerView 的 CardView 中展开和折叠带有省略号 的 TextView 的最佳方法是什么?

例如:"...查看更多"

我正在寻找一些关于如何制作功能性可扩展和可折叠的“...查看更多”或“继续阅读”功能的指南,但我对其中的大多数都不满意,所以我想出了自己的我想与所有人分享它,尤其是那些使用 Firebase Recycler Adapter 来显示其数据的人。希望这对遇到我遇到的同样问题的人有所帮助。

您需要做的第一件事是将 CardView 的高度 设置为 wrap_content
之后的一切都将使用 Java.
以编程方式完成
接下来,将此方法放在扩展 RecyclerView.ViewHolder:

的 ViewHolder 中
 private void Ellipsize(boolean activate, TextView textView){

        if (activate) {
            textView.setSingleLine(true);
            textView.setEllipsize(TextUtils.TruncateAt.END);
        }
        else{
            textView.setSingleLine(false);
            textView.setEllipsize(null);
        }
    }

调用 Ellipsize(boolean activate, TextView textView); 并传入必要的参数。传入 trueyour_long_text_view 给它一个省略号。

void setText(String text){
        TextView textTV = itemView.findViewById(R.id.TEXTVIEW_ID);
        textTV.setText(text);
        Ellipsize(true, textTV);
    }

要为您的 TextView 提供展开和折叠功能,请在您的 ViewHolder 中添加此方法:
isExpanded 的布尔值是 false 并在全局声明。

    private void ExpandCollapse(final TextView textView, final View view){

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isExpanded) {
                    TransitionManager.beginDelayedTransition((ViewGroup) view.getRootView(), new AutoTransition());
                    Ellipsize(false, textView);
                }
                else{
                    TransitionManager.beginDelayedTransition((ViewGroup) view.getRootView(), new AutoTransition());
                    Ellipsize(true, textView);
                }
                isExpanded = !isExpanded;
            }
        });

    }
  

添加所有必要的方法后,在您的 onBindViewHolder 中调用它们并传入在您的 ViewHolder class 和 itemView[=23 中全局声明的 TextView =]

 @Override
        protected void onBindViewHolder(@NonNull final ViewHolder holder, final int position, @NonNull final Model model) {
            holder.setText(model.getText());
            holder.ExpandCollapse(holder.textTV, holder.itemView);

        }