文章http://blog.csdn.net/michael1112/article/details/53907868 描述了recycleView的原理。

本文章将动画进行了封装。 用接口回调将onItemMove(int fromPosition, int toPosition) 的实现放到具体的adapter

1.实现 ItemDragHelperCallback

public class ItemDragHelperCallback extends ItemTouchHelper.Callback {private OnItemMoveListener mOnItemMoveListener;
    private boolean mIsLongPressEnabled;

    public void setLongPressEnabled(boolean longPressEnabled) {mIsLongPressEnabled = longPressEnabled;
    }public interface OnItemMoveListener {boolean onItemMove(int fromPosition, int toPosition);
    }public ItemDragHelperCallback(OnItemMoveListener onItemMoveListener) {mOnItemMoveListener = onItemMoveListener;
    }@Override
    public boolean isLongPressDragEnabled() {return mIsLongPressEnabled;
    }@Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {int dragFlags = setDragFlags(recyclerView);
        int swipeFlags = 0;
        return makeMovementFlags(dragFlags, swipeFlags);
    }private int setDragFlags(RecyclerView recyclerView) {int dragFlags;
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        } else {dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        }return dragFlags;
    }@Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {return !isDifferentItemViewType(viewHolder, target) &&mOnItemMoveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());

    }private boolean isDifferentItemViewType(RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {return viewHolder.getItemViewType() != target.getItemViewType();
    }@Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);

    }@Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {}
}

2.NewsChannelActivity.java

@Override
public void returnMineNewsChannels(List<NewsChannelTable> newsChannelsMine) {channelAdapterMine = new ChannelAdapter(mContext,R.layout.item_news_channel);
    newsChannelMineRv.setLayoutManager(new GridLayoutManager(this, 4, LinearLayoutManager.VERTICAL, false));
    newsChannelMineRv.setItemAnimator(new DefaultItemAnimator());
    newsChannelMineRv.setAdapter(channelAdapterMine);
    channelAdapterMine.replaceAll(newsChannelsMine);
    channelAdapterMine.setOnItemClickListener(new ChannelAdapter.OnItemClickListener() {@Override
        public void onItemClick(View view, int position) {NewsChannelTable newsChannel = channelAdapterMine.get(position);
                channelAdapterMore.add(newsChannel);
                channelAdapterMine.removeAt(position);
                mPresenter.onItemAddOrRemove((ArrayList<NewsChannelTable>) channelAdapterMine.getAll(), (ArrayList<NewsChannelTable>)channelAdapterMore.getAll());

        }});

    ItemDragHelperCallback itemDragHelperCallback = new ItemDragHelperCallback(channelAdapterMine);
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragHelperCallback);
    itemTouchHelper.attachToRecyclerView(newsChannelMineRv);
    channelAdapterMine.setItemDragHelperCallback(itemDragHelperCallback);
}

3..ChannelAdapter.java

public class ChannelAdapter  extends CommonRecycleViewAdapter<NewsChannelTable>implements
        ItemDragHelperCallback.OnItemMoveListener{private ItemDragHelperCallback mItemDragHelperCallback;
    private OnItemClickListener mOnItemClickListener;
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {mOnItemClickListener = onItemClickListener;
    }public void setItemDragHelperCallback(ItemDragHelperCallback itemDragHelperCallback) {mItemDragHelperCallback = itemDragHelperCallback;
    }public ChannelAdapter(Context context, int layoutId) {super(context, layoutId);
    }@Override
    public void convert(ViewHolderHelper helper, NewsChannelTable newsChannelTable) {helper.setText(R.id.news_channel_tv,newsChannelTable.getNewsChannelName());
        if (newsChannelTable.getNewsChannelFixed()) {helper.setTextColor(R.id.news_channel_tv,ContextCompat.getColor(mContext,R.color.gray));
        }else{helper.setTextColor(R.id.news_channel_tv,ContextCompat.getColor(mContext,R.color.gray_deep));
        }handleLongPress(helper,newsChannelTable);
        handleOnClick(helper,newsChannelTable);
    }private void handleLongPress(ViewHolderHelper helper,final NewsChannelTable newsChannelTable) {if (mItemDragHelperCallback != null) {helper.itemView.setOnTouchListener(new View.OnTouchListener() {@Override
                public boolean onTouch(View v, MotionEvent event) {mItemDragHelperCallback.setLongPressEnabled(newsChannelTable.getNewsChannelIndex()==0?false:true);
                    return false;
                }});
        }}private void handleOnClick(final ViewHolderHelper helper,final NewsChannelTable newsChannelTable) {if (mOnItemClickListener != null) {helper.itemView.setOnClickListener(new OnNoDoubleClickListener() {@Override
                protected void onNoDoubleClick(View v) {if (!newsChannelTable.getNewsChannelFixed()) {mOnItemClickListener.onItemClick(v, helper.getLayoutPosition());
                    }}});
        }}@Override
    public boolean onItemMove(int fromPosition, int toPosition) {if (isChannelFixed(fromPosition, toPosition)) {return false;
        }Collections.swap(getAll(), fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);
        RxBus.getInstance().post(AppConstant.CHANNEL_SWAP,new ChannelItemMoveEvent(fromPosition, toPosition));
        return true;
    }private boolean isChannelFixed(int fromPosition, int toPosition) {return (getAll().get(fromPosition).getNewsChannelFixed() ||getAll().get(toPosition).getNewsChannelFixed())&&(fromPosition==0||toPosition==0);
    }public interface OnItemClickListener {void onItemClick(View view, int position);
    }
}

git hub: https://github.com/whtchl/AndroidNews.git

RecycleView 动画实现相关推荐

  1. Android开源库集合(UI效果)

    动画效果 粒子动画效果 https://github.com/glomadrian/Grav 水波式loading等待动画 https://github.com/race604/WaveLoading ...

  2. Android 开源交流 QQ 群分享汇总

    Android 开源交流 QQ 群分享汇总 :      https://github.com/aosp-exchange-group/share 简介 分享者 AndroidDevTools中文 北 ...

  3. Android 开源交流分享汇总

    目录 开源交流 1 群 ------ 开源交流 2 群 ------ 开源交流 3 群 开源交流 4 群 ------ 开源交流 5 群 ------ 开源交流 6 群 原创 简介 几群 作者 加速球 ...

  4. android studio 成长历程

     转载-Android 开源交流 QQ 群分享汇总 :      https://github.com/aosp-exchange-group/share 简介 分享者 AndroidDevToo ...

  5. Android 交流分享汇总

    Android 开源交流 QQ 群分享汇总 :      https://github.com/aosp-exchange-group/share 简介 分享者 AndroidDevTools中文 北 ...

  6. Android RecyclerView多样式列表实践指南

    前言 在日常的开发中我们经常会在一个列表数据中展示多种样式. 比如一个新闻列表,顶部是一个焦点Banner,然后是展示文章列表,文章中间可能插入某个图片广告,底部是一个加载更多/没有更多数据的加载状态 ...

  7. 一战,二战,再战,最后尘埃落定,缘定美团

    回忆 去年由于疫情,上半年一直在家里.2月份本来无忧无虑,呆在家里不给国家添乱的时候,发现身边的同学找到了大厂的offer.心里开始有点慌张.本来想在3月份如果能回到学校,就开始考研之路,但谁曾想这个 ...

  8. android 光晕动画,Android去掉SrollView、GrdiView、RecycleView、ViewPager等可滑动控件滑动到边缘的光晕效果...

    下面以RecycleView为例,其他可滑动控件也是一样的 在XML中设置: android:id="@+id/rv_recycle_view" android:layout_wi ...

  9. RecycleView的Item Animator动画

    RecyclerView能够通过mRecyclerView.setItemAnimator(ItemAnimator animator)设置添加.删除.移动.改变的动画效果. RecyclerView ...

最新文章

  1. iOS 四种保存数据的方式!
  2. 快速统计hbase中某张表中数据条数
  3. cmw500综合测试仪使用_高端示波器是德MSOX4154A示波器-产品使用操作说明书【二手示波器吧】...
  4. 【STC15库函数上手笔记】5、定时器
  5. MYSQL BENCHMARK函数的使用
  6. php 抽象类 静态方法吗,php中的抽象类和静态方法是什么
  7. Redis数据结构之集合
  8. 怎么判断自己是不是备胎 ?
  9. postgis之获取二进制的长度
  10. Android中日期与时间设置控件的使用
  11. Tomcat安装及环境配置(详细教程)
  12. libcrypto yum 安装_centos7下nginx 报错需要安装 libcrypto.so.10(OPENSSL_1.0.2)(64bit)
  13. 洛谷 U80455 逃跑的Seaway
  14. 将linux系统制作成iso镜像文件
  15. vue读取服务器文件,vue读取txt文件
  16. ios 扫码枪外设 键盘模式_想把 iPad 当笔记本电脑用?可以试试这款外接键盘
  17. matlab 概率分布程序,常见的概率分布(matlab作图)
  18. 【Word】插入题注图1-1,并在文章中交叉引用
  19. 推迟上市的网易云,逃不开在线音乐市场的“白刃战”
  20. Loadrunner之关联——用小故事理解

热门文章

  1. java代码如何与界面联系在一起_如何在Visual Studio Code 中编写Java代码
  2. C++对象模型1——类对象的sizeof、static成员、对象模型、this指针
  3. C++知识点52——多重继承
  4. opencv中的Rodrigues()函数
  5. 如何安装vscode网页版_Windows10专业版/企业版如何安装Microsoft store
  6. html5 图形化操作,HTML5的图像及动画图形操作-20210525222751.ppt-原创力文档
  7. NumSharp v0.8.0 发布,C# 张量计算库
  8. react中高阶组件
  9. 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
  10. 11月29日云栖精选夜读:阿里传奇工程师多隆的程序世界