android 快速实现 recyclerview 的所有item 都执行动画

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);

相关推荐

  1. android 快速实现 recyclerview 所有item 执行动画

    2024-03-10 14:16:05       22 阅读
  2. AndroidRecyclerView自由拖动item

    2024-03-10 14:16:05       37 阅读
  3. android recyclerView緩存數量 recycleview缓存

    2024-03-10 14:16:05       8 阅读
  4. android recyclerviewanimation滚动中动画停止了?

    2024-03-10 14:16:05       30 阅读
  5. Android 无限循环RecyclerView完美实现方案

    2024-03-10 14:16:05       30 阅读
  6. Android基础-RecyclerView优点

    2024-03-10 14:16:05       9 阅读
  7. Android RecyclerView

    2024-03-10 14:16:05       11 阅读
  8. 掌握 Android RecyclerView 优化

    2024-03-10 14:16:05       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 14:16:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 14:16:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 14:16:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 14:16:05       20 阅读

热门阅读

  1. 2024.3.9 C++启航 梦开始的地方

    2024-03-10 14:16:05       23 阅读
  2. 博客杂谈---程序员如何选择职业赛道?

    2024-03-10 14:16:05       22 阅读
  3. node.js中path.join() 和 path.resolve()

    2024-03-10 14:16:05       22 阅读
  4. Git常用命令

    2024-03-10 14:16:05       16 阅读
  5. llama2c(4)之forward、sample、decode

    2024-03-10 14:16:05       20 阅读
  6. 安全运营方案的基本框架和关键要素

    2024-03-10 14:16:05       26 阅读
  7. html2canvas+jsPDF实现前端导出pdf

    2024-03-10 14:16:05       23 阅读
  8. python使用pdfkit把html文本转换成pdf非常慢

    2024-03-10 14:16:05       21 阅读
  9. urllib.error.HTTPError: HTTP Error 400: Bad Request

    2024-03-10 14:16:05       20 阅读