1、需求: 文字列表中展示收起和全部
2、采用RecyclerView 实现列表,网上查找了许多展开收起的样式,实测结果不如人意,
2.1 设置了最大展示行数之后,出现了展开之后,收起出错的问题
2.2 显示文字的View错位的时候,点击“收起/展开”事件无效。设置了点击事件,实际没有执行 onInterceptTouchEvent 中 mAnimating引起
3、解决方式
解决方案:点击跳转
4、工具类
package xxx;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.SparseBooleanArray;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.IdRes;
public class ExpandableTextView extends LinearLayout implements View.OnClickListener {
private static final String TAG = ExpandableTextView.class.getSimpleName();
private static final int EXPAND_INDICATOR_IMAGE_BUTTON = 0;
private static final int EXPAND_INDICATOR_TEXT_VIEW = 1;
// private static final int DEFAULT_TOGGLE_TYPE = EXPAND_INDICATOR_IMAGE_BUTTON;
private static final int DEFAULT_TOGGLE_TYPE = EXPAND_INDICATOR_TEXT_VIEW;
/* The default number of lines */
private static final int MAX_COLLAPSED_LINES = 3;
/* The default animation duration */
private static final int DEFAULT_ANIM_DURATION = 300;
/* The default alpha value when the animation starts */
private static final float DEFAULT_ANIM_ALPHA_START = 0.7f;
protected TextView mTv;
protected View mToggleView; // View to expand/collapse
private boolean mRelayout;
private boolean mCollapsed = true; // Show short version as default.
private int mCollapsedHeight;
private int mTextHeightWithMaxLines;
private int mMaxCollapsedLines;
private int mMarginBetweenTxtAndBottom;
private ExpandIndicatorController mExpandIndicatorController;
private int mAnimationDuration;
private float mAnimAlphaStart;
private boolean mAnimating;
@IdRes
private int mExpandableTextId = R.id.item_dynamic_source_textview;
@IdRes
private int mExpandCollapseToggleId = R.id.item_dynamic_expandTextview;
private boolean mExpandToggleOnTextClick;
/* Listener for callback */
private OnExpandStateChangeListener mListener;
/* For saving collapsed status when used in ListView */
private SparseBooleanArray mCollapsedStatus;
private int mPosition;
public ExpandableTextView(Context context) {
this(context, null);
}
public ExpandableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs);
}
@Override
public void setOrientation(int orientation){
if(LinearLayout.HORIZONTAL == orientation){
throw new IllegalArgumentException("ExpandableTextView only supports Vertical Orientation.");
}
super.setOrientation(orientation);
}
@Override
public void onClick(View view) {
if (mToggleView.getVisibility() != View.VISIBLE) {
return;
}
mCollapsed = !mC