帮我写一个recyclerView item删除动画
时间: 2023-05-22 19:06:13 浏览: 59
当一个 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 应该根据你自己的需求来设定。动画效果可以根据自己的需求来调整,这里给出的只是一个简单的例子。