как правильно оживить (развернуть и свернуть) текстовое представление с несколькими строками - PullRequest
0 голосов
/ 22 марта 2019

У меня есть вид recycle с двумя TextViews. Один показан, а другой невидим (ушел). Когда я нажимаю кнопку раскрытия, второе текстовое представление становится видимым с плавной анимацией. Когда я сворачиваю текстовое представление, используя метод setVisible (GONE), текстовое представление не разрушается, используя анимацию.

Я использую следующую раскладку для элемента адаптера:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:animateLayoutChanges="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fafafa"
    android:orientation="horizontal"
    android:paddingTop="8dp"
    android:paddingBottom="8dp" >

    <include
        android:id="@+id/questionNumberTV"
        layout="@layout/circular_step_number" />

        <LinearLayout
            android:layout_marginLeft="4dp"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:orientation="vertical">

         <TextView
             android:id="@+id/item_title"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:textColor="#000"
             android:textSize="22sp"
             android:layout_marginLeft="16dp"
             android:layout_marginRight="16dp"
             android:paddingTop="4dp"
             android:paddingBottom="4dp"
             android:maxLines="2"
             tools:text="Léon: The Professional sa sa saddsa das" />

            <LinearLayout
                android:id="@+id/expandContainer"
                android:visibility="visible"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:animateLayoutChanges="true"
                android:orientation="vertical">

        <TextView
            android:visibility="gone"
            android:id="@+id/sub_item_genre"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="Genre:  Crime, Drama, Thriller"
             />

           </LinearLayout>

        </LinearLayout>

    <ImageView
        android:layout_marginLeft="24dp"
        android:id="@+id/expandOrColapse"
        android:src="@drawable/ic_chevron_down_black_24dp"
        android:layout_width="24dp"
        android:layout_height="24dp" />
   </LinearLayout>

А код адаптера Java ниже:

import android.animation.LayoutTransition;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

import static android.view.View.GONE;

public class RecAdapter extends RecyclerView.Adapter<RecAdapter.RecViewHolder> {

    private static final String TAG = RecAdapter.class.getName();

    private List<Movie> list;

    private int lastExpandedMoviePosition = -1;

    public RecAdapter(List<Movie> list) {
        this.list = list;
    }

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

    @Override
    public void onBindViewHolder(RecViewHolder holder, int position) {
        holder.bindBean(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list == null ? 0 : list.size();
    }

    public class RecViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private View questionNumberTV;
        private TextView title;
        private TextView genre;
        private ImageView expandOrColapseIV;
        private LinearLayout expandContainer;

        public RecViewHolder(View itemView) {
            super(itemView);
            expandContainer = (LinearLayout) itemView.findViewById(R.id.expandContainer);
            questionNumberTV = itemView.findViewById(R.id.questionNumberTV);
            title = itemView.findViewById(R.id.item_title);
            genre = itemView.findViewById(R.id.sub_item_genre);
            expandOrColapseIV = itemView.findViewById(R.id.expandOrColapse);
            expandOrColapseIV.setOnClickListener(this);
        }

        private void bindBean(Movie movie) {
            boolean expanded = movie.isExpanded();
            //questionNumberTV.setText((getAdapterPosition() + 1) + ".");
            genre.setVisibility(expanded ? View.VISIBLE : GONE);
            genre.setText("Genre: " + movie.getGenre());

            if (movie.isAnswered()) {
                expandContainer.getLayoutTransition().setDuration(800);
                expandContainer.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
                expandContainer.getLayoutTransition().setAnimateParentHierarchy(true);
                if (expanded) {
                    expandOrColapseIV.setImageDrawable(ContextCompat.getDrawable(itemView.getContext(), R.drawable.ic_chevron_up_black_24dp));
                    // setHeightChangeAnimation(expandContainer);
                } else {
//                  collapse(expandContainer);
                    expandOrColapseIV.setImageDrawable(ContextCompat.getDrawable(itemView.getContext(), R.drawable.ic_chevron_down_black_24dp));
                }
            }

            title.setText(movie.getTitle());
        }

        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.expandOrColapse) {
                lastExpandedMoviePosition = getAdapterPosition();
                list.get(lastExpandedMoviePosition).setExpanded(!list.get(lastExpandedMoviePosition).isExpanded());
                list.get(lastExpandedMoviePosition).setAnswered(true);
                notifyItemChanged(lastExpandedMoviePosition);
            }
        }
    }
}

С наилучшими пожеланиями, Аврелиан

1 Ответ

0 голосов
/ 25 марта 2019

Я нашел ответ здесь (сообщение Германа Клекера) Android: получить высоту вида до его отрисовки

private void expandView( final View view ) {

      view.setVisibility(View.VISIBLE);

      LayoutParams parms = (LayoutParams) view.getLayoutParams();
      final int width = this.getWidth() - parms.leftMargin - parms.rightMargin;

      view.measure( MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
              MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

      final int targetHeight = view.getMeasuredHeight();

      view.getLayoutParams().height = 0;

      Animation anim = new Animation() {
         @Override
         protected void applyTransformation( float interpolatedTime, Transformation trans ) {
            view.getLayoutParams().height =  (int) (targetHeight * interpolatedTime);
            view.requestLayout();
         }

         @Override
         public boolean willChangeBounds() {
            return true;
         }
      };

      anim.setDuration( ANIMATION_DURATION );
      view.startAnimation( anim );
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...