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的子类 ...
随机推荐
- PHP读取XML数据中CDATA内数值
// 在开发过程中遇到对XML获取时候加载 CDATA 无法读取内部的数值(例如微信平台的返回值) $content = simplexml_load_string('<content>& ...
- FastDFS 实现图片上传_01
一.jar 包 jar包下载:https://pan.baidu.com/s/1nwkAHU5 密码:tlv6 或者 下载工程,安装到 maven 本地仓库 工程下载:https://pan.baid ...
- 一个HTTP连接是包含两部分的,请求报文和响应报文这俩组合起来才是一次完整的HTTP请求,并不会单独显示请求报文或者响应报文
一个HTTP连接是包含两部分的,请求报文和响应报文这俩组合起来才是一次完整的HTTP请求,并不会单独显示请求报文或者响应报文. 2.注意看,一次HTTP请求,是包括这两部分的
- hiho模拟面试题2 补提交卡 (贪心,枚举)
题目: 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Ho给自己定了一个雄伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去了.小Ho查 ...
- oracle 11g sql developer安装后无法使用
oracle11g安装后出现 再去官网单独下来个sql developer安装 sql developer须要jre支持
- [codeforces 852 D] Exploration Plan 解题报告 (二分+最大匹配)
题目链接:http://codeforces.com/problemset/problem/852/D 题目大意: 有V个点,N个队伍,E条边,经过每条边有个时间,告诉你初始N个队伍的位置,求至少有K ...
- HTML5学习笔记(二):用于构建页面的语义元素
1.语义元素 大多数HTML5语义元素的用途是标识页面中的一个内容区块,为标注的内容赋予额外的含义,不真正做任何事. 2.使用语义元素的原因 容易修改和维护: 无障碍性(现代Web设计的一个重要主题) ...
- ORACLE 11g RAC-RAC DG Duplicate 搭建(生产操作文档)
环境:rhel 6.7 64位源库:ORACLE 11204 RAC 未打PSU备库:ORACLE 11204 RAC PSU 20170718 一.停止中间件并做全库备份 1.在节点2做全备 2.首 ...
- 访问Storm ui界面,出现Nimbus Summary或Supervisor Summary时有时无的问题解决(图文详解)
不多说,直接上干货! 前期博客 apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解) apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)( ...
- ibatis annotations 注解方式返回刚插入的自增长主键ID的值--转
原文地址:http://www.blogs8.cn/posts/WWpt35l mybatis提供了注解方式编写sql,省去了配置并编写xml mapper文件的麻烦,今天遇到了获取自增长主键返回值的 ...