RecyclerView中ItemView設定LayoutTransition,解決itemView的子view減少時,RecyclerView先於itemview改變的問題
阿新 • • 發佈:2021-01-24
關鍵在於
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; } } }