关键在于
mTransitioner.enableTransitionType(LayoutTransition.CHANGING);
mTransitioner.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING,0);
整个itemview的代码
package com.cjr.learnapplication;
import android.animation.LayoutTransition;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class MyLinearLayout extends LinearLayout implements View.OnClickListener {
TextView tv;
public MyLinearLayout(Context context) {
this(context, null);
}
public MyLinearLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
LayoutTransition mTransitioner = new LayoutTransition();
// 需要设置为true,保证自己改变是平滑的(即当子view变大变小时,自己的宽高是动画变化的,而不是突变的)
mTransitioner.enableTransitionType(LayoutTransition.CHANGING);
// 子view出现时的延迟,可以设为300,等layout的宽高设置好了再开启动画
// mTransitioner.setStartDelay(LayoutTransition.APPEARING,300);
//最好马上消失,否则会挡住新的顶替上来的view
// mTransitioner.setStartDelay(LayoutTransition.DISAPPEARING,0);
// mTransitioner.setStartDelay(LayoutTransition.CHANGE_APPEARING,0);
// 其他view消失,引起自身的改变,需要设为0,否则,parent已经改变了,这个还没改变
mTransitioner.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING,0);
// mTransitioner.setStartDelay(LayoutTransition.CHANGING,0);
setLayoutTransition(mTransitioner);
setBackgroundResource(R.drawable.bg_mylinearlayout);
setOrientation(VERTICAL);
inflate(getContext(), R.layout.rv_item_root, this);
tv = findViewById(R.id.title);
findViewById(R.id.add).setOnClickListener(this);
findViewById(R.id.sub).setOnClickListener(this);
}
public void setText(String text) {
tv.setText(text);
}
public void setText(int textId) {
tv.setText(textId);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
Button btn = (Button) LayoutInflater.from(getContext()).inflate(R.layout.rv_item, this, false);
btn.setText("this is a Button " + getChildCount());
addView(btn, 2);
break;
case R.id.sub:
// getLayoutTransition().removeChild(this, getChildAt(getChildCount() -1));
if (getChildCount() > 2) {
this.removeViewAt(2);
// 也可以考虑以下做法 + addTransitionListener
// this.getLayoutTransition().addChild(this, getChildAt(2));
}
break;
}
}
}