1.在adapter 里面重写onViewAttachedToWindow 和 onViewDetachedFromWindow 两个方法
package com.example.widget;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class GridAdapter extends RecyclerView.Adapter {
private boolean mIsRunAnim;//是否执行动画
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
public int getItemCount() {
return 0;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mIsRunAnim) {//点击item停止抖动动画
mIsRunAnim = false;
notifyDataSetChanged();
} else {
ToastUtil.showToast(mList.get(holder.getBindingAdapterPosition()).getName());
}
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (!mIsRunAnim) {//执行动画
Logs.i(TAG, "itemView-onLongClick");
mIsRunAnim = true;
notifyDataSetChanged();//刷新适配器
return true;
}
return false;
}
});
}
//view依附窗口上时
@Override
public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
if (mIsRunAnim){
//仿桌面删除app 的抖动动画
RotateAnimation animation = new RotateAnimation(-2, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animation.setDuration(100);
animation.setRepeatMode(Animation.REVERSE);
animation.setRepeatCount(Animation.INFINITE);
animation.setInterpolator(new LinearInterpolator());
holder.itemView.startAnimation(animation);//itemView执行动画
//holder.ivIcon.startAnimation(animation);//执行子view动画
}
super.onViewAttachedToWindow(holder);
}
//view被移除时
@Override
public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) {
if (holder.itemView.getAnimation() != null) {
holder.itemView.clearAnimation();//清除动画
}
super.onViewDetachedFromWindow(holder);
}
}
2.拓展:长按拖动换位
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public boolean isLongPressDragEnabled() {//是否可以拖动
return gridAdapter.isRunAnim();
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
Logs.i(TAG,"getMovementFlags");
// 上下左右都可以拖拽
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, 0);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
// 获取当前item和目标item的位置
int fromPosition = viewHolder.getBindingAdapterPosition();
int toPosition = target.getBindingAdapterPosition();
Logs.i(TAG,"onMove=fromPos="+fromPosition+",toPos="+toPosition);
// 交换数据集中的位置
Collections.swap(list, fromPosition, toPosition);
// 通知适配器数据交换
gridAppListAdapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
});
itemTouchHelper.attachToRecyclerView(reclclerView);
reclclerView.setLayoutManager(gridLayoutManager);
reclclerView.setAdapter(gridAdapter);