RecyclerView中ItemView设置LayoutTransition,解决itemView的子view减少时,RecyclerView先于itemview改变的问题

关键在于

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值