行业知识
android 快速实现 recyclerview 的所有item 都执行动画
2026-11-12 19:19:52
来源:互联网转载
1.在aindex.php/tags-41973.html" >dapter 里面重写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);()
下一篇:哪里有免费服务器?