1. 程式人生 > 其它 >RecyclerView中ItemView設定LayoutTransition,解決itemView的子view減少時,RecyclerView先於itemview改變的問題

RecyclerView中ItemView設定LayoutTransition,解決itemView的子view減少時,RecyclerView先於itemview改變的問題

技術標籤:widgetandroid

關鍵在於

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;
        }
    }
}