RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能
RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢?
官方提供了ItemTouchHelper类使用过程例如以下:
- 定义ItemTouchHelper.Callback实现类,下面是几个重要的方法
package com.zms.copyapp.helper; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log; /**
* Created by Msn on 2015/7/28.
*/
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback{ private ItemTouchListener mItemTouchListener; public MyItemTouchHelperCallback(ItemTouchListener itemTouchListener){
mItemTouchListener = itemTouchListener;
} /**
* 支持长按进入拖动
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
return true;
} @Override
public boolean isItemViewSwipeEnabled() {
return false;
} /**
* 指定拖动和滑动支持的方向
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//List部分功能
// int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//拖动支持向下和向上
// int swipeFlag = ItemTouchHelper.START | ItemTouchHelper.END;//滑动支持向左和向右
//Grid部分功能
int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN |ItemTouchHelper.START | ItemTouchHelper.END;
int swipeFlag = 0;
return makeMovementFlags(dragFlag,swipeFlag);
} @Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
Log.e("Test","onMove--------------------------------");
mItemTouchListener.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
return true;
} @Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
Log.e("Test", "onSwiped--------------------------------");
mItemTouchListener.onItemDismiss(viewHolder.getAdapterPosition());
} /**
* 在每次View Holder的状态变成拖拽 (ACTION_STATE_DRAG) 或者 滑动 (ACTION_STATE_SWIPE)的时候被调用。
* @param viewHolder
* @param actionState
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if(actionState != ItemTouchHelper.ACTION_STATE_IDLE){
ItemStatusListener listener = (ItemStatusListener)viewHolder;
listener.onItemSelected();
}
super.onSelectedChanged(viewHolder, actionState);
} /**
* 在一个view被拖拽然后被放开的时候被调用,
* @param recyclerView
* @param viewHolder
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
ItemStatusListener listener = (ItemStatusListener)viewHolder;
listener.onItemClear();
}
}
- 声明ItemTouchHelper。并绑定到待管理的RecyclerView上
ItemTouchHelper.Callback helperCallback = new MyItemTouchHelperCallback(adapter);
helper = new ItemTouchHelper(helperCallback);
helper.attachToRecyclerView(recyclerView);
- 在Adapter中定义滑动删除和拖动排序的数据逻辑
package com.zms.copyapp; import android.graphics.Color;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView; import com.zms.copyapp.helper.ItemStatusListener;
import com.zms.copyapp.helper.ItemTouchListener; import org.w3c.dom.Text; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; /**
* Created by Msn on 2015/7/28.
*/
public class MyRecyclerListAdapter extends RecyclerView.Adapter<MyRecyclerListAdapter.MyViewHolder>
implements ItemTouchListener{
public final static String[] STR_ARRAY = {"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGTH","NINE","TEN"};
private final List<String> mItems = new ArrayList<>(); private OnDragListener dragListener; public MyRecyclerListAdapter(OnDragListener listener) {
mItems.addAll((Arrays.asList(STR_ARRAY)));
dragListener = listener;
} @Override
public void onItemMove(int fromPosition, int toPosition) {
String prev = mItems.remove(fromPosition);
mItems.add(toPosition > fromPosition ? toPosition - 1 : toPosition, prev);
notifyItemMoved(fromPosition,toPosition);
} @Override
public void onItemDismiss(int position) {
mItems.remove(position);
notifyItemRemoved(position);
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main,parent,false);
return new MyViewHolder(view);
} @Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.textView.setText(mItems.get(position));
holder.handleImgv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(MotionEventCompat.getActionMasked(motionEvent)
== MotionEvent.ACTION_DOWN){
dragListener.onStartDrag(holder);
Log.e("Test","onTouch.ACTION_DOWN");
}
return false;
}
});
} @Override
public int getItemCount() {
return mItems.size();
} public class MyViewHolder extends RecyclerView.ViewHolder implements ItemStatusListener{
public ImageView handleImgv;
public TextView textView;
public MyViewHolder(View view){
super(view);
textView = (TextView)view.findViewById(R.id.text);
handleImgv = (ImageView)view.findViewById(R.id.handle);
} @Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
} @Override
public void onItemClear() {
itemView.setBackgroundColor(Color.TRANSPARENT);
}
} public interface OnDragListener{
public void onStartDrag(MyViewHolder holder);
public void onStartSwipe(MyViewHolder holder);
}
}
这样一个拖动重排的功能就实现了:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能的更多相关文章
- Android学习之ItemTouchHelper实现RecylerView的拖拽以及滑动删除功能
今天在群里见大神们提到控件的拖动以及滑动删除的效果实现,就在网上找了资料ItemTouchHelper学习,并实现其功能.不胜窃喜之至,忍不住跟大家分享一下,如今就对学习过程做下简介.帮助大家实现这样 ...
- IOS第七天(6:UiTableView编辑模式, 拖动位置 ,滑动删除)
**********UiTableView编辑模式, 拖动位置 ,滑动删除 #import "HMViewController.h" @interface HMViewContro ...
- 自定义listView添加滑动删除功能
今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...
- RecyclerView实现拖动排序和滑动删除功能
RecyclerView 的拖动排序需要借助一下 ItemTouchHelper 这个类,ItemTouchHelper 类是 Google 提供的一个支持 RecyclerView 滑动和拖动的一个 ...
- Android滑动删除功能
今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. ...
- android 继承ListView实现滑动删除功能.
在一些用户体验较好的应用上,可以经常遇见 在ListView中 向左或向右滑动便可删除那一项列表. 具体实现 则是继承ListView实现特定功能即可. (1). 新建 delete_butt ...
- 如何在RecyclerView上面实现"拖放"和"滑动删除"-1
Android上面有许多的教程, 库和示例, 在RecyclerView上面实现"拖放"和"滑动删除"功能. 尽管有更新, 更好的方法可用, 但是大多数人依然使 ...
- 安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能
大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下 ...
- ItemTouchHelper(实现RecyclerView上添加拖动排序与滑动删除的所有事情)
简单介绍: ItemTouchHelper是一个强大的工具,它处理好了关于在RecyclerView上添加拖动排序与滑动删除的所有事情.它是RecyclerView.ItemDecoration的子类 ...
随机推荐
- sql查询语句中on和where的区别
sql中的连接查询分为3种, cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别 ...
- 楼宇自控-BA系统流程总图
总结一下过程中的节点和技能,希望能对其他人有所帮助
- 项目复习期总结3:CSS引入方式,凝视,命名规范,背景,行高,文本属性
文件夹: 1.CSS凝视的书写 怎么写?优点? 2.CSS引入方式 各种的优缺点 3.选择器的写法与选择器的优先级 4.CSS命名规范 5.背景,行高 6.文本(text与font开头)等全部属性 ...
- js算法:分治法-棋盘覆盖
在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k> ...
- IBM AppScan官方帮助文档错别字缺陷,IBM的測试人员也太粗心了吧
袁术=元素?
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
- zzulioj--1600--直线与圆(简单数学几何)
1600: 直线与圆 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 360 Solved: 73 SubmitStatusWeb Board ...
- 整数翻转C++实现 java实现 leetcode系列(七)
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...
- 20.boost dijkstra最短路径算法
到某个点的最短距离 到终点的最短路径 完整代码 #include <iostream> #include <string> #include &l ...
- 项目结合activiti工作流框架使用
项目结合activiti工作流框架使用: 1.项目与工作流框架的结合. 2.状态:草稿(待审批).审批中.审批通过.审批失败 3. 提交审批: 0 草稿(待审批),记录绑定工作流执行id,审批状态设置 ...