Android RecyclerView滑动删除和拖动排序

本篇是接着上面三篇之后的一个对RecyclerView的介绍,这里多说两句,如果你还在使用ListView的话,可以放弃掉ListView了。RecyclerView自动帮我们缓存Item视图(ViewHolder),允许我们自定义各种动作的动画和分割线,允许我们对Item进行一些手势操作。另外,因为Design库的推出大大方便我们编写带有Material风格的App,而ListView是不兼容这个库的,比如滑动的相互协调,只有RecyclerView能做到。

先看本篇内容的效果图:

效果内容主要有三部分:
 •长按点击其中一个Item之后可以将其拖动到其他地方
 •向左右滑动可以删除某个Item
 •长按的时候会有一个浮起的动作,放下之后会重新重新对齐

①先易后难,卡片浮起效果 
 在Material Design中,物件的呈现是以3d的模式来进行的,也就是在原来的基础上增加了一个Z轴来表示物体的高度。

当我们点击一个卡片的时候,应该给予用户一些反馈,让用户知道自己在操作这个卡片,也就是触摸反馈。触摸效果图的触摸反馈是先出现水波纹,接着当卡片可以移动的时候先浮动,再开始移动,最后下落,效果如下:(浮起的动画可能要仔细看)

实现:
 水波纹效果使用系统提供的,因为Demo中使用的是一个CardView来呈现内容,所以只需要给CardView加上两个属性即可:
 android:clickable="true"
 android:foreground="?android:attr/selectableItemBackground" 
 浮起和下沉的动画也不难,改变View的translationZ属性即可:

private void pickUpAnimation(View view) { ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationZ", 1f, 10f); animator.setInterpolator(new DecelerateInterpolator()); animator.setDuration(300); animator.start(); }

②滑动(Swipe)和移动(Move)Item
 Swipe是指我们上面的左右滑动删除,Move则是我们对Item的移动,改变列表的排序。要实现这两个功能,需要用到一个类ItemTouchHelper,当我们构造好这个类之后,可以调用它的attachToRecyclerView方法将其绑定在某个RecyclerView中,当RecyclerView出现某些操作(滑动和移动)时,构造这个类的时候传入的回调类会回调相应的方法,我们在这些方法中对数据集进行操作即可。
 new ItemTouchHelper(new ItemTouchHelper.Callback() {    //省略代码
}).attachToRecyclerView(mRecyclerView); 
 接着就是重写接口Callback的方法了,这里需要重写的有几个,分别是:
 •isItemViewSwipeEnable : Item是否可以滑动
 •isLongPressDragEnable :Item是否可以长按
 •getMovementFlags : 获取移动标志
 •onMove : 当一个Item被另外的Item替代时回调,也就是数据集的内容顺序改变
 •onMoved : 当onMove返回true的时候回调
 •onSwiped : 当某个Item被滑动离开屏幕之后回调
 •setSelectedChange : 某个Item被长按选中会被回调,当某个被长按移动的Item被释放时也调用

new ItemTouchHelper(new ItemTouchHelper.Callback() { private RecyclerView.ViewHolder vh; @Override public boolean isItemViewSwipeEnabled() { return true; } @Override public boolean isLongPressDragEnabled() { return true; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 拖拽的标记,这里允许上下左右四个方向 int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; // 滑动的标记,这里允许左右滑动 int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(dragFlags, swipeFlags); } /* 这个方法会在某个Item被拖动和移动的时候回调,这里我们用来播放动画,当viewHolder不为空时为选中状态 否则为释放状态 */ @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); if (viewHolder != null) { vh = viewHolder; pickUpAnimation(viewHolder.itemView); } else { if (vh != null) { putDownAnimation(vh.itemView); } } } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { // 移动时更改列表中对应的位置并返回true Collections.swap(newsList, viewHolder.getAdapterPosition(), target .getAdapterPosition()); return true; } /* 当onMove返回true时调用 */ @Override public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) { super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y); // 移动完成后刷新列表 mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target .getAdapterPosition()); } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 将数据集中的数据移除 newsList.remove(viewHolder.getAdapterPosition()); // 刷新列表 mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition()); } }).attachToRecyclerView(mRecyclerView);

这里直接贴出代码,并做了注释,应该比较简单了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-24 04:20:15

Android RecyclerView滑动删除和拖动排序的相关文章

Android RecyclerView滑动删除和拖动排序_Android

本篇是接着上面三篇之后的一个对RecyclerView的介绍,这里多说两句,如果你还在使用ListView的话,可以放弃掉ListView了.RecyclerView自动帮我们缓存Item视图(ViewHolder),允许我们自定义各种动作的动画和分割线,允许我们对Item进行一些手势操作.另外,因为Design库的推出大大方便我们编写带有Material风格的App,而ListView是不兼容这个库的,比如滑动的相互协调,只有RecyclerView能做到. 先看本篇内容的效果图:   效果内

Android ListView滑动删除操作(SwipeListView)_Android

新版本的微信和QQ上引入的滑动删除功能是现在比较流行的一个功能.其实这个滑动删除的控件,github上已经有了,是一个热门的开源框架SwipeListView.不过,这个SwipeListView是一个framelayout,即是一个两层的布局,上面的布局front覆盖了下面的布局back,滑动的时候则会滑开front,这样下面的back就显示出来了.但是看了一下微信的滑动删除好像不是这样的,感觉更像是一个超出了屏幕的单层布局,滑动的时候是右边超出屏幕的button进入屏幕,猜测应该不是使用Sw

Android实现滑动删除操作(PopupWindow)_Android

参考Android仿腾讯QQ实现滑动删除这篇文章进行学习,文章实现的功能是:在ListView的Item上从右向左滑时,出现删除按钮,点击删除按钮把Item删除,效果 看过文章后,感觉没有必要把dispatchTouchEvent()和onTouchEvent()两个方法都重写,只要重写onTouchEvent就好了.于是对代码作了一些调整:  public class MyListView extends ListView { private static final String TAG =

Android ListView滑动删除操作(SwipeListView)

新版本的微信和QQ上引入的滑动删除功能是现在比较流行的一个功能.其实这个滑动删除的控件,github上已经有了,是一个热门的开源框架SwipeListView.不过,这个SwipeListView是一个framelayout,即是一个两层的布局,上面的布局front覆盖了下面的布局back,滑动的时候则会滑开front,这样下面的back就显示出来了.但是看了一下微信的滑动删除好像不是这样的,感觉更像是一个超出了屏幕的单层布局,滑动的时候是右边超出屏幕的button进入屏幕,猜测应该不是使用Sw

Android实现滑动删除操作(PopupWindow)

参考Android仿腾讯QQ实现滑动删除这篇文章进行学习,文章实现的功能是:在ListView的Item上从右向左滑时,出现删除按钮,点击删除按钮把Item删除,效果 看过文章后,感觉没有必要把dispatchTouchEvent()和onTouchEvent()两个方法都重写,只要重写onTouchEvent就好了.于是对代码作了一些调整: public class MyListView extends ListView { private static final String TAG =

Android仿QQ列表滑动删除操作_Android

这篇山寨一个新版QQ的列表滑动删除,上篇有说到QQ的滑动删除,推测原理就是ListView本身每个item存在一个Button,只不过普通的状态下隐藏掉了,检测到向左的滑动事件的时候弹出隐藏的Button,不过再切换Button状态的时候会给Button一个出现和隐藏的动画.下面实现这个ListView.  首先有个难点就是通过ListView获取它某个item的View,对于ViewGroup,可以直接调用getChildAt()方法获取对应的子view,但是在ListView直接使用getC

Android实现评论栏随Recyclerview滑动左右移动_Android

最近在玩一个叫"约会吧"的应用,也是在看直播app,默认下载安装的,安装点进去看这个应用做的不错,就留下来了.然后看他们动态详情页底部有一个效果:Recyclerview滑动到的评论列表的时候,底部点赞那栏会往左滑动,出现一个输入评论的栏:然后下拉到底部的时候输入评论栏会往右滑动,出现点赞栏.详细细节直接来看效果图吧. 其实这种效果现在在应用中还是很常见的,有上拉,toolbar.底部view隐藏,下拉显示,或者像现在约会吧这样左右滑动的效果.而且网上资料现在也有很多,有通过Objec

Android仿微信对话列表滑动删除效果_Android

微信对话列表滑动删除效果很不错的,借鉴了github上SwipeListView(项目地址:https://github.com/likebamboo/SwipeListView),在其上进行了一些重构,最终实现了微信对话列表滑动删除效果. 实现原理 1.通过ListView的pointToPosition(int x, int y)来获取按下的position,然后通过android.view.ViewGroup.getChildAt(position)来得到滑动对象swipeView  2.

Android:下拉刷新+加载更多+滑动删除实例讲解_Android

         小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第一时间掌握最新消息,加载更多是什么nie,简单来说就是在网页上逛淘宝的时候,我们可以点击下一页来满足我们更多的需求,但是在手机端就不一样了,没有上下页,怎么办nie,方法总比困难多,细心的小伙伴可能会发现,在手机端中,有加载更多来满足我们的要求,其实加载更多也是分页的一种体现.小伙