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@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return null;}@Overridepublic int getItemCount() {return 0;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mIsRunAnim) {//点击item停止抖动动画mIsRunAnim = false;notifyDataSetChanged();} else {ToastUtil.showToast(mList.get(holder.getBindingAdapterPosition()).getName());}}});holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {if (!mIsRunAnim) {//执行动画Logs.i(TAG, "itemView-onLongClick");mIsRunAnim = true;notifyDataSetChanged();//刷新适配器return true;}return false;}});}//view依附窗口上时@Overridepublic 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被移除时@Overridepublic 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() {@Overridepublic boolean isLongPressDragEnabled() {//是否可以拖动return gridAdapter.isRunAnim();}@Overridepublic 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);}@Overridepublic 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;}@Overridepublic void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {}});itemTouchHelper.attachToRecyclerView(reclclerView);reclclerView.setLayoutManager(gridLayoutManager);reclclerView.setAdapter(gridAdapter);
仿桌面删除app Demo:https://download.csdn.net/download/qq_29364417/88934293?spm=1001.2014.3001.5501