android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item

前几天写了一片关于RecyclerView滑动删除Item,RecyclerView长按拖拽Item的博客,本来很简单一个使用,阅读量还挺高的,原博客传送门。

今天介绍一个RecyclerView Item侧滑菜单,RecyclerView滑动删除Item,RecyclerView长按拖拽Item的开源项目,效果看下图,大家也可以下载演示apk具体操作体验下SwipeRecyclerView的强大。

需要说明的是,本库没有对RecyclerView做大的修改,只是ItemView的封装。看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已。

今天的博客将完美解决这些问题:

RecyclerView侧滑菜单(左右两侧都可以添加)(List、Grid两种形式)。

RecyclerView长按拖拽Item(List、Grid两种形式)。

RecyclerView侧滑删除item(List、Grid两种形式)。

指定RecyclerView的某一个Item不能滑动删除或长按拖拽(List、Grid两种形式)。

根据Item的ViewType来决定显示的菜单。

用SwipeMenuLayout在任何地方都可以实现你自己的侧滑菜单。

SwipeRecyclerView的源码托管在Github:https://github.com/yanzhenjie...,欢迎Star。

如果不能打开Github,直接从CSDN上下载Demo。

效果图

如果网页加载速度慢,可以下载demo的apk看效果。

侧滑菜单

RecyclerView Item侧滑菜单。左右两侧都可以添加侧滑菜单,菜单Item包括图标、文字、点击背景颜色等。也可以根据Item的ViewType来决定某个Item的Menu的样子、类型等:

14600000067603231460000006237221

拖拽、侧滑菜单

RecyclerView Item长按后拖拽Item移动位置。同时支持Item长按拖拽、Item侧滑显示菜单。包括各种布局管理器,比如LinearLayoutManager、GridLayoutManager都完美支持:

14600000062372271460000006237229

拖拽、侧滑删除

可以指定某个Item不能被拖拽,指定某个Item不能被滑动删除:

14600000062372321460000006237235

引用方法

Eclipse 请自行下载源码。

AndroidStudio使用Gradle构建添加依赖(推荐)

compile 'com.yanzhenjie:recyclerview-swipe:1.0.0'

本库引用的RecyclerView版本如下:

compile 'com.android.support:recyclerview-v7:23.4.0'

使用介绍

这里列出关键实现,具体请参考demo,或者加我博客左侧的交流群或者关注我的公众微信一起来讨论。

实现原理

侧滑菜单使用自定义Layout实现,继承自FragmeLayout。

长按拖拽Item、滑动Item删除由ItemTouchHelper实现。

启用SwipeReyclerView的长按Item拖拽功能和侧滑删除功能

recyclerView.setLongPressDragEnabled(true);// 开启长按拖拽

recyclerView.setItemViewSwipeEnabled(true);// 开启滑动删除。

recyclerView.setOnItemMoveListener(onItemMoveListener);// 监听拖拽和侧滑删除,更新UI。

...

/**

* 当Item移动的时候监听。

*/

private OnItemMoveListener onItemMoveListener = new OnItemMoveListener() {

@Override

public boolean onItemMove(int fromPosition, int toPosition) {

// 当Item被拖拽的时候,交换Item的位置。

Collections.swap(mStrings, fromPosition, toPosition);

mMenuAdapter.notifyItemMoved(fromPosition, toPosition);

return true;

}

@Override

public void onItemDismiss(int position) {

// 当Item被滑动删除的时候,删除Item。

mStrings.remove(position);

mMenuAdapter.notifyItemRemoved(position);

Toast.show(mContext, "第" + position + "条被删除。");

}

};

添加Item侧滑菜单

侧滑菜单支持自动打开某个Item的菜单,并可以指定是左边还是右边的:

// 打开第一个Item的左侧菜单。

recyclerView.openLeftMenu(0);

// 打开第一个Item的右侧菜单。

recyclerView.openRightMenu(0);

第一步,引用自定义View:SwipeMenuReyclerView:

android:id="@+id/recycler_view"

android:layout_width="match_parent"

android:layout_height="wrap_content"

app:layout_behavior="@string/appbar_scrolling_view_behavior" />

第二步,设置菜单创建器、菜单点击监听:

SwipeMenuRecyclerView swipeMenuRecyclerView = findViewById(R.id.recycler_view);

// 设置菜单创建器。

swipeMenuRecyclerView.setSwipeMenuCreator(swipeMenuCreator);

// 设置菜单Item点击监听。

swipeMenuRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);

第三步,菜单创建器创建菜单:

/**

* 菜单创建器。在Item要创建菜单的时候调用。

*/

private SwipeMenuCreator swipeMenuCreator = new SwipeMenuCreator() {

@Override

public void onCreateMenu(SwipeMenu swipeLeftMenu, SwipeMenu swipeRightMenu, int viewType) {

SwipeMenuItem addItem = new SwipeMenuItem(mContext)

.setBackgroundDrawable(R.drawable.selector_green)// 点击的背景。

.setImage(R.mipmap.ic_action_add) // 图标。

.setWidth(size) // 宽度。

.setHeight(size); // 高度。

swipeLeftMenu.addMenuItem(addItem); // 添加一个按钮到左侧菜单。

SwipeMenuItem deleteItem = new SwipeMenuItem(mContext)

.setBackgroundDrawable(R.drawable.selector_red)

.setImage(R.mipmap.ic_action_delete) // 图标。

.setText("删除") // 文字。

.setTextColor(Color.WHITE) // 文字颜色。

.setTextSize(16) // 文字大小。

.setWidth(size)

.setHeight(size);

swipeRightMenu.addMenuItem(deleteItem);// 添加一个按钮到右侧侧菜单。

}

};

第四步,继承SwipeMenuAdapter,和正常的Adapter一样使用:

public class MenuAdapter extends SwipeMenuAdapter {

@Override

public int getItemCount() {

return 0;

}

@Override

public View onCreateContentView(ViewGroup parent, int viewType) {

return null;

}

@Override

public ViewHolder onCompatCreateViewHolder(View realContentView, int viewType) {

return null;

}

@Override

public void onBindViewHolder(MenuAdapter.DefaultViewHolder holder, int position) {

}

}

就到这里,更多的细节,请参考Github上的demo和源码,源码demo下载传送门。

欢迎加入我的技术交流群:Android 愚公移山③ 547839514

欢迎关注我的公众号,长期不断推送优选博文、优秀开源项目,欢迎投稿:

1460000006237240

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有关PHP、HTML单引号、双引号转义以及转成HTML实体的那些事!

一、单引号和双引号转义在PHP的数据存储过程中用得比较多,即往数据库里面存储数据时候需要注意转义单、双引号; 先说几个PHP函数: 1、addslashes — 使用反斜线引用(转义)字符串; 返回字符串,…

设为首页 和 收藏本站js代码 兼容IE,chrome,ff

设为首页 和 收藏本站js代码 兼容IE,chrome,ff//设为首页function SetHome(obj,url){try{obj.style.behaviorurl(#default#homepage);obj.setHomePage(url);}catch(e){if(window.netscape){try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect&q…

android listview 数据数组制作,android – 从对象的数组列表中填充listview

在你的活动AdapterPerson adbPerson;ArrayList myListItems new ArrayList();//then populate myListItemsadbPerson new AdapterPerson (youractivity.this, 0, myListItems);listview.setAdapter(adbPerson);适配器public class AdapterPerson extends ArrayAdapter {privat…

centos 8 安装使用配置

服务端安装nfs 1、使用yum安装nfs yum install nfs-utils nfs-utils-lib -y 如果出现上述错误请安装lvm2 yum install -y lvm2 2、编辑文件exports vim /etc/exports 加入代码,如: /home *(insecure,rw,sync,no_root_squash) #参数详解 ro #只读共享…

linux内核笔记-内核同步

linux内核就相当于不断对请求进行响应的服务器,这些请求可能来自CPU,可能来自发出中断的外部设备。我们将内核看作两种请求的侍者。 (1)老板提出请求,侍者如果空闲,为老板服务。(系统调用或异常…

ECshop 快捷登录插件 支持QQ 支付宝 微博

亲自测试可以使用,分享给大家。(承接各种EcShop改版,二次开发等相关项目 QQ:377898650) 安装的时候按照里面说明。安装即可。 代码下载:http://pan.baidu.com/s/1c0kUYIk -------------------------------- 代码修改过程-------------首先a…

Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载

MySqlHelper.cs代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;using System.Data;using System.Collections;using MySql.Data.MySqlClient;using MySql.Data.Types;using System.Configuration;…

有史以来最详细 安装部署Kubernetes Dashboard (补充解决官方出现的一些RBAC CERT等问题)

安装部署Kubernetes Dashboard (补充解决官方出现的一些RBAC CERT等问题) 官方文档:https://github.com/kubernetes/dashboard 参考文章:https://kuboard.cn/install/install-k8s-dashboard.html# 前言 Kubernetes Dashboard 是 Kubernetes 的官方 W…

技术者的好奇心和惯性

这回老孙讲讲好奇心。本杰明富兰克林,十八世纪美国最伟大的科学家和发明家,著名的政治家、外交家、哲学家、文学家和航海家以及美国独立战争的伟大领袖。有人称其为“资本主义精神最完美的代表”。富兰克林这个人或许衬不上这等称誉,但绝对是…

2s相机 android6,Android Camera2 使用总结

最近在做自定义相机相关的项目,网上查了资料都是有关android.hardware.Camera的资料,开始使用的才发现这个类已经废弃了。Android 5.0(21)之后android.hardware.Camera就被废弃了,取而代之的是全新的android.hardware.Camera2 。Android 5.0对…

简单的小工具wordlight——让VS变量高亮起来

前段时间一直在使用matlab,今天需要使用vs2008,而用惯了matlab,习惯了其中一项选中变量高亮的设置,突然回来使用VS,感到各种不适应,顿时想到了一个词:矫情 呵呵,于是在网上找各种插…

CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分布式集群

CentOS 7上搭建Spark3.0.1 Hadoop3.2.1分布式集群 VMWare 安装CentOS 7使用Xshell连接虚拟机集群设置安装JDK 1.8SSH 免密登陆安装hadoop 3.2安装Spark 3.0.1总结VMWare 安装CentOS 7 推荐使用VMware Workstation Pro 16,下载安装即可。下载最新的CentOS 7 Minimal…

微软的SQLHelper类(含完整中文注释)

using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collections; namespace Book.DAL { /// <summary> /// SqlServer数据访问帮助类 /// </summary> public sealed class SqlHelper { #region 私有构造函数和方法 p…

再见安卓 你好鸿蒙,安卓,再见!你好,鸿蒙系统!

今年9月份&#xff0c;华为宣布鸿蒙OS操作系统将面向手机发布&#xff0c;今年12月份正式开放开发者Beta版本。昨天&#xff0c;华为鸿蒙OS迎来里程碑式的新进展&#xff0c;开发者Beta版本如约而至&#xff0c;正式开启线上公测招募&#xff0c;我们也可以可以一睹鸿蒙系统真容…

Kubernetes 部署 Traefik Ingress 控制器 (1.7.12)

目录[-] . 一、Ingress 介绍. 二、Traefik 介绍. 三、部署 Ingress 控制器 Traefik. 1、Traefik 两种部署方式介绍. 2、创建 Traefik 配置文件. 3、将 Traefik 配置文件挂载到 ConfigMap. 4、设置 CA 证书. 5、给节点设置 Label. 6、创建 Traefik 服务账户与角色权限. 7、创建…

Android (cocos2dx 网络访问)访问权限设置

Android开发应用程序时&#xff0c;如果应用程序需要访问网络权限,需要在 AndroidManifest.xml 中加入以下代码: 同样的如果用到其它的权限&#xff0c;也需要作出声明,部分权限列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在 checki…

获取页面所有属性并生成html6,JavaScript基础练习题(三)

一、单选题1.以下关于Javascript中事件的描述中&#xff0c;不正确的是A click——鼠标单击事件B focus——获取焦点事件C mouseover——鼠标指针移动到事件源对象上时触发的事件D change——选择字段时触发的事件正确答案: D解析:change事件为input内容发生改变时触发的事件。…

Git本地缓存问题 修改密码后git无法拉取

Git本地缓存问题 修改密码后git无法拉取 问题描述&#xff1a;使用正确的用户名和密码可以登录到Git代码仓库&#xff0c;但是在本地无法使用Git bash命令行的方式拉取代码。 问题原因&#xff1a;第一次使用Git bash方式拉取代码时&#xff0c;会根据当前的用户和密码生成一串…

Ext.Net常用方法

1、js&#xff08;Ext&#xff09;操作 Ext.Msg.alert(系统提示, 未连接血站&#xff0c;该功能暂时不能使用。); Ext.getCmp("id").getValue();Ext.getCmp("id").focus();Ext.getCmp("id").selectText(); //选中修改 if (!GridPanel1.hasSelec…