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);
这里直接贴出代码,并做了注释,应该比较简单了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Java 泛型有哪些好处详解
推荐阅读
-
Android RecyclerView滑动删除和拖动排序
-
Android 滑动监听RecyclerView线性流+左右划删除+上下移动
-
Android RecyclerView滑动删除和拖动排序
-
Android实现ListView左右滑动删除和编辑
-
Android实现ListView左右滑动删除和编辑
-
Android开发在RecyclerView上面实现"拖放"和"滑动删除"-2
-
Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除
-
android的RecyclerView实现拖拽排序和侧滑删除示例
-
Android recyclerview实现拖拽排序和侧滑删除
-
Android中RecyclerView实现Item添加和删除的代码示例