记录一个RecyclerView Item高度变化的坑

在一次开发中利用RecyclerView+CardView做了个滚动刷新的卡片内容列表,运行起来发现只要滑动了列表后再滑回去,手机画面就会被一张卡片占领了整个高度,经过检查发现Item布局的最外层layout的高度写成了match_parent,导致滑动后重新加载卡片就变成了占领整个页面,修改为wrap_content自适应后就正常了,粗心大意造成的小错误,记录一下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当一个 RecyclerView 中的项目需要被删除时,通常可以使用适配器的 notifyItemRemoved() 方法来触发这个过程。在这个方法被调用之后,RecyclerView 会移除对应位置的项目并重新对其它项目进行布局,但这个过程默认不会产生任何动画效果。 如果你想要一个平滑、有动画效果的删除过渡效果,可以参考以下的实现方式: 首先,在你的 Adapter 类中添加一个方法来删除指定位置的项目,这个方法中应该把该项目从数据列表中移除并调用 Adapter 的 notifyItemRemoved() 来通知 RecyclerView 对其它项目进行布局调整。 ```java public void removeItem(int position) { dataList.remove(position); notifyItemRemoved(position); } ``` 然后,在你的 RecyclerView.ViewHolder 类中添加一个方法来执行实际的动画效果。这个方法应该使用 ViewPropertyAnimator 来平滑地动画删除该项目的视图,而不是直接让视图突然消失。 ```java public void animateDelete() { View itemView = itemView; ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams(); int originalHeight = itemView.getHeight(); // 如果需要删除的项目不是最后一个,我们需要将所有后面的项目上移一个指定的距离 if (!isLastItem()) { int itemHeight = itemView.getResources().getDimensionPixelSize(R.dimen.list_item_height); ObjectAnimator upAnimator = ObjectAnimator.ofFloat(itemView, "translationY", 0, -itemHeight); upAnimator.setDuration(ANIMATION_DURATION); upAnimator.start(); // 待上移的项目需要重新调整它们的位置 for (int i = getAdapterPosition() + 1; i < adapter.getItemCount(); i++) { RecyclerView.ViewHolder vh = recyclerView.findViewHolderForAdapterPosition(i); if (vh != null) { ObjectAnimator upAnimator2 = ObjectAnimator.ofFloat(vh.itemView, "translationY", 0, -itemHeight); upAnimator2.setDuration(ANIMATION_DURATION); upAnimator2.start(); } } } // 动画删除当前项目 ObjectAnimator animator = ObjectAnimator.ofInt(layoutParams.height, 0); animator.setDuration(ANIMATION_DURATION); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animator) { adapter.removeItem(getAdapterPosition()); itemView.setLayoutParams(layoutParams); } }); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); layoutParams.height = val; itemView.setLayoutParams(layoutParams); } }); animator.start(); } ``` 最后,在你的 RecyclerView.Adapter 类中,重写 onCreateViewHolder() 方法来为每个项目设置一个点击监听器。在监听器被触发时,你可以先使用适配器的 getViewHolderForAdapterPosition() 方法获取到该项目的 ViewHolder,然后调用它的 animateDelete() 方法来实现动画效果并删除该项目。 ```java @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item, parent, false); MyViewHolder viewHolder = new MyViewHolder(itemView); // 为每个项目设置一个点击监听器 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MyViewHolder holder = (MyViewHolder) recyclerView.findContainingViewHolder(view); holder.animateDelete(); } }); return viewHolder; } ``` 注意,以上代码中 animator 的播放时间 ANIMATION_DURATION 应该根据你自己的需求来设定。动画效果可以根据自己的需求来调整,这里给出的只是一个简单的例子。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nbin_Newby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值