-
C#开发实战1200例(第一卷+第二卷)+源码下载地址.txt
2019-05-17 09:24:24实例045 批量替换某一类字符串 58 实例046 对字符串进行加密与解密 59 3.3 常用数字处理技术 61 实例047 判断输入的货币值是否为数字 61 实例048 对计算结果进行四舍五入 62 实例049 商品金额的大小... -
微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理、消息群发等基础功能外,还有二维码推广、营销活动、微网站、会员卡、优惠券等。 zheng-wechat-app 微信小程序后台 zheng-message ...
-
ATL开发指南(第二版)(PDF高清版)带书签附源码
2013-05-26 11:24:527.4.2 步骤二:添加CallBack类 7.4.3 步骤三:通知并传送组件 7.5 可连接对象 7.5.1 IConnectionPointContainer 7.5.2 IConnectionPoint 7.5.3 连接点、自动化和IProvideClassInfo2 7.5.4 IProvideClassInfo2... -
RecyclerView交互动画
2017-08-17 23:14:56二,分析如何做到: 之前写过一篇层叠卡片相册集,里面就用到了RecylerView一个拓展帮助类。谷歌在v7包中的这个帮助类ItemTouchHelper提供,它用来绑定RecylerView并且监听RecylerView内部的各种动作和行为,通过...一,我们先上效果图如下:
我们可以通过托拽让RecylerView的每个条目进行上下移动并调整位置。二,分析如何做到:
之前写过一篇层叠卡片相册集,里面就用到了RecylerView一个拓展帮助类。谷歌在v7包中的这个帮助类ItemTouchHelper提供,它用来绑定RecylerView并且监听RecylerView内部的各种动作和行为,通过callBack回掉来处理RecylerView的滑动和拖拽行为和动作。
我们在MainActivity里面可以些出代码:ItemTouchHelper itemTouchHelper=new ItemTouchHelper(callback); itemTouchHelper.attachToRecyclerView(mRecylerView);
我们可以发现itemTouchHelper需要一个回掉类callback,我们来查看这个callback干嘛用的。我们点击源码可以看到在ItemTouchHelper内部有一个抽象静态内部类CallBack,通过源码注释
This class is the contract between ItemTouchHelper and your application. It lets you control * which touch behaviors are enabled per each ViewHolder and also receive callbacks when user * performs these actions.
我们可以知道这个类是帮助了和应用程序之间的合同,桥梁。它可以让用户界面接受回掉函数,来控制触摸行为和动作。接下来我们来自定义类并实现它。
代码如下:public class ItemTouchHelperCallBack extends ItemTouchHelper.Callback { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } @Override public boolean isLongPressDragEnabled() { return true; } }
我们继续看Callback的源码:分析每个方法干嘛用的:
首先是onMove()方法:
* Called when ItemTouchHelper wants to move the dragged item from its old position to
* the new position.
public abstract boolean onMove()可以看出这个方法用来给ItemTouchHelper回掉条目从原来位置移动到新位置。
然后是getMovementFlags方法
这个方法源码解释返回持有视图着拖动的方向。其实就是返回我们拖动item的方向。代码如下:
这里我们需要明白makeMovementFlags();这个方法是用来计算你手拖动和侧滑的方向。他会进行计算返回给你最终的方向值。我们这里先设置拖拽方向,侧滑方向就设为0,看看效果。@Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //这里是拖缀行为的方向。分为四个方向。我们设置为上下拖缀 int dragFlages = ItemTouchHelper.DOWN | ItemTouchHelper.UP; //这里侧滑方向我们左右为0。不让左右不然滑动。 int swipFlags = 0; int flages = makeMovementFlags(dragFlages, swipFlags); return flages; }
目前整个代码如下:
public class ItemTouchHelperCallBack extends ItemTouchHelper.Callback { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlages = ItemTouchHelper.DOWN | ItemTouchHelper.UP; int swipFlags = 0; int flages = makeMovementFlags(dragFlages, swipFlags); return flages; } //当拖拽时候回掉的方法。 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return true; } //当侧滑时候调用的方法。 @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } @Override public boolean isLongPressDragEnabled() { return true; } }
然后我们在Activity中调用代码如下:
mRecylerView.setAdapter(mAdapter); mRecylerView.setLayoutManager(new LinearLayoutManager(this)); ItemTouchHelper itemTouchHelper=new ItemTouchHelper(new ItemTouchHelperCallBack()); itemTouchHelper.attachToRecyclerView(mRecylerView);
运行代码效果如下:
我们可以看出我们进行拖拽时候可以进行移动条目的位置。这里我们进行拖拽时候只有长安之后拖拽才会起作用。这样用户体验效果很差。有什么办法我们可以通过当按下头像就开始拖拽么?
我们可以发现ItemToucherHelper有一个方法,itemTouchHelper.startDrag(RecyclerView.ViewHolder);随时调用这个方法可以实现
拖拽动作。并且立即执行。那么我们如何可以在点击头像时候调用这个方法。接下来我们来实现这个代码:
我们在适配器中点击按下头像时候来进行接口回调在activity中实现调用。
首先来个接口实现回调。代码如下:public interface StartDragListener { public void StartDragListener(RecyclerView.ViewHolder viewHolder); }
我们在适配器里面点击这个头像时候监听触摸事件这里我们只需要判断按下时候进行接口回调,并且开启拖缀。代码如下:
holder.iv_logo.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN){ startDragListener.StartDragListener(holder); return true; } return false; } });
这时候我们可以运行效果如下:
我们可以看出我们进行拖拽时候可以进行移动条目的位置。这里我们进行拖拽时候只有长安之后拖拽才会起 作用。这样用户体验效果很差。有什么办法我们可以通过当按下头像就开始拖拽么?我们可以 ItemToucherHelper有一个方itemTouchHelper.startDrag(RecyclerView.ViewHolder); 下来我们来实现这个代码:我们在适配器中点击按下头像时候来进行接口回调在activity中实现调用。首 先来个接口实现回调。代码如下:
public interface StartDragListener { public void StartDragListener(RecyclerView.ViewHolder viewHolder); }
我们在适配器里面点击这个头像时候监听触摸事件这里我们只需要判断按下时候进行接口回调,并且开启拖缀。代码如下:
holder.iv_logo.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN){ startDragListener.StartDragListener(holder); return true; } return false; } });
这时候我们可以运行效果如下:
从最初的位置移动到目标位置。接下来我们来实现这个效果。 我之前一篇文章写过当关于添加数据到列表的item中,实现显示和更新。我们可以通过在适配器里面进行查看 到适配器有很多的方法例如: * @see #notifyItemChanged(int) @see #notifyItemInserted(int) * @see #notifyItemRemoved(int) * @see #notifyItemRangeChanged(int, int) * @see #notifyItemRangeInserted(int, int) * @see #notifyItemRangeRemoved(int, int) 源码知道:它是用来通知适配器条目从开始位置移动到目标位置。 所以我们可以通过这个方法进行条目的移动。
那问题来了什么时候进行位置的移动呢?当然是从我们拖拽开始到目标位置松手之后来通知适配器执行这个方法notifyItemMoved(int fromPosition, int toPosition)进行位置移动呀。那我们就需要把拖拽开始的位置和结束的位置记录下来,然后通知给适配器进行更新。我们就需要定义一个接口来传递起点和终点位置来通知适配器,进行更新。接下来我们来定义接口:代码如下:
public interface OnMoveItemLisenner{ //我们需要其实位置和终点位置。 public boolean onMoveItemLisenner(int fromStartposition,int toEndposition); }
接下来我们需要让适配器实现我们的接口:等待回调时候替换位置。代码如下:
@Override public boolean onMoveItemLisenner(int fromStartposition, int toEndposition) { notifyItemMoved(fromStartposition,toEndposition); return false; }
最后我们需要在onMove()方法中去开启回调。首先我们需要在自定义的ItemTouchHelperCallBack里面 持有实现接口的适配器实例对象,才能进行回调实现。所以我们在activity里面来传递参数里面传递一个实 现了我们接口的适配器,让ItemTouchHelperCallBack持有它。代码如下:
itemTouchHelper=new ItemTouchHelper(new ItemTouchHelperCallBack(mAdapter));
最后我们在onMove里面进行开启回调,通知适配器进行移动更新。
//拖拽 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return true; } 我们在这个方法里面进行设置: //拖拽 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { //这个判断可以不写。如果你的布局是但布局。如果列表时多布局,那么只有相同类型的才可以移动。 if(viewHolder.getItemViewType()==target.getItemViewType()){ int startPosition = viewHolder.getAdapterPosition(); int endPosition = target.getAdapterPosition(); boolean moveflag=onMoveItemLisenner.onMoveItemLisenner(startPosition,endPosition); if(moveflag){ return true; }else { return false; } }else{ return false; } }
到目前所有的事基本做完。但是我运行之后发现拖拽之后列表活动到低端,再看列表item又回到拖拽之前的位 置,我们这里忘记在通知替换位置之前没有替换两个位置的数据。我们在这里需要替换数据。 Collections.swap(list,fromStartposition,toEndposition);其实在javaAPI中提供很多方 法,没必要自己去替换。
@Override public boolean onMoveItemLisenner(int fromStartposition, int toEndposition) { Collections.swap(list,fromStartposition,toEndposition); notifyItemMoved(fromStartposition,toEndposition); return true; }
最终完成了RecyclerView的拖拽动画。如下图:
我下面贴出gitHub下载地址:
https://github.com/luhenchang/Lsn6_MaterialDesign_Recycler_ItemTouchHelper.git -
Android开发权威指南(第一版扫描版).李宁.pdf
2014-03-29 18:38:548.3.3 数据绑定与SimpleCursorAdapter类 252 8.3.4 操作SD卡上的数据库 255 8.3.5 将数据库与应用程序一起发布 256 8.3.6 内存数据库 257 8.4 小结 258 第9章 Android中的窗口——Activity 259 9.1 ... -
Nehe的OpenGL教程电子书
2018-04-07 12:25:03你将学会如何把256个不同的文字从一个256x256的纹理图像中分别提取出来,并为每一个文字创建一个显示列表,接着创建一个输出函数来创建任意你希望的文字。 18.二次几何体 利用二次几何体,你可以很容易的创建球... -
asp.net知识库
2015-06-18 08:45:45类如何与界面绑定 在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射... -
C#编程经验技巧宝典
2008-06-01 08:59:3388 <br>0136 如何进行文本加密与解密 88 <br>0137 如何区别0、空字符串、Null、Empty和Nothing 89 <br>0138 从字符串中分离文件路径、文件名及扩展名 89 <br>0139 如何批量替换某一类字符串 89... -
Android基础教程
2013-04-09 10:56:38第二部分 Android基础知识 第3章 设计用户界面 3.1 数独游戏简介 3.2 声明性设计 3.3 创建启动界面 3.4 使用替代资源 3.5 实现About对话框 3.6 应用主题 3.7 添加菜单 3.8 添加设置 3.9 开始新游戏 3.1 调试程序 ... -
NeHe_OpenGL教程(完整版) 里面有源码下载地址(可以迅雷下载 亲测)
2010-10-18 00:24:30你将学会如何把256个不同的文字从一个256x256的纹理图像中分别提取出来,并为每一个文字创建一个显示列表,接着创建一个输出函数来创建任意你希望的文字。 18.二次几何体 利用二次几何体,你可以很容易的创建球,... -
帝国CMS使用教程。。、
2009-06-25 22:20:496、如何绑定栏目的域名 7、FLASH/视频的防盗链方法 六、模板 (一)、修改首页模板 (二)、列表模板制作 (三)、内容模板制作 (四)、公共模板变量 (五)、搜索模板制作 (六)、模板标签 1、系统... -
寒江独钓-Windows内核安全编程(高清完整版).part1
2011-01-04 11:02:593.1.2 设备绑定的内核API之二 43 3.1.3 生成过滤设备并绑定 43 3.1.4 从名字获得设备对象 45 3.1.5 绑定所有串口 46 3.2 获得实际数据 47 3.2.1 请求的区分 47 3.2.2 请求的结局 48 3.2.3 写请求的数据 49 3.3 完整... -
寒江独钓-Windows内核安全编程(高清完整版).part7
2011-01-04 11:14:493.1.2 设备绑定的内核API之二 43 3.1.3 生成过滤设备并绑定 43 3.1.4 从名字获得设备对象 45 3.1.5 绑定所有串口 46 3.2 获得实际数据 47 3.2.1 请求的区分 47 3.2.2 请求的结局 48 3.2.3 写请求的数据 49 3.3 完整... -
尹成Python27天入门到项目实战
2020-12-05 17:04:22面向对象编程与深浅拷贝面向对象与过程的差异self用途动态绑定增加属性方法重载运算符的概念有名对象与匿名对象重载运算符的返回值重载运算符多个类型类的拷贝是浅复制深浅拷贝函数调用参数副本原理函数调用可以... -
C#高级编程(第9版).(清华出版.李铭译.黄静审校).part2
2016-07-15 20:45:235.1.3 二进制代码的重用 5.1.4 代码的扩展 5.1.5 命名约定 5.2 创建泛型类 5.3 泛型类的功能 5.3.1 默认值 5.3.2 约束 5.3.3 继承 5.3.4 静态成员 5.4 泛型接口 5.4.1 协变和抗变 5.4.2 泛型接口的协变 5.4.3 泛型... -
C#高级编程(第9版).(清华出版.李铭译.黄静审校).part1
2016-07-15 20:42:375.1.3 二进制代码的重用 5.1.4 代码的扩展 5.1.5 命名约定 5.2 创建泛型类 5.3 泛型类的功能 5.3.1 默认值 5.3.2 约束 5.3.3 继承 5.3.4 静态成员 5.4 泛型接口 5.4.1 协变和抗变 5.4.2 泛型接口的协变 5.4.3 泛型... -
C#高级编程(第9版).(清华出版.李铭译.黄静审校).part3
2016-07-15 20:48:045.1.3 二进制代码的重用 5.1.4 代码的扩展 5.1.5 命名约定 5.2 创建泛型类 5.3 泛型类的功能 5.3.1 默认值 5.3.2 约束 5.3.3 继承 5.3.4 静态成员 5.4 泛型接口 5.4.1 协变和抗变 5.4.2 泛型接口的协变 5.4.3 泛型... -
C#全能速查宝典
2014-04-26 16:16:27《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表...,共包含562个C#编程中常用的属性、方法、类和各种技术... -
Visual C++ 2008入门经典--详细书签版
2013-02-02 16:07:15本书延续了ivor horton讲解编程语言的独特方法,从中读者可以学习visual c++ 2008的基础知识,了解如何使用mfc进行本地iso/ansi c++ windows应用程序开发以及如何使用windows forms进行c++/cli windows应用程序开发... -
Windows内核安全与驱动开发光盘源码
2015-07-11 11:56:287.1.2 设备绑定的内核API之二 98 7.1.3 生成过滤设备并绑定 98 7.1.4 从名字获得设备对象 100 7.1.5 绑定所有串口 101 7.2 获得实际数据 102 7.2.1 请求的区分 102 7.2.2 请求的结局 103 7.2.3 写请求的数据 ... -
Windows内核安全驱动开发(随书光盘)
2015-08-02 15:57:437.1.2 设备绑定的内核API之二 98 7.1.3 生成过滤设备并绑定 98 7.1.4 从名字获得设备对象 100 7.1.5 绑定所有串口 101 7.2 获得实际数据 102 7.2.1 请求的区分 102 7.2.2 请求的结局 103 7.2.3 写请求的数据 ... -
Visual C++ 2008入门经典--源代码及课后练习答案
2013-02-02 16:13:25本书延续了ivor horton讲解编程语言的独特方法,从中读者可以学习visual c++ 2008的基础知识,了解如何使用mfc进行本地iso/ansi c++ windows应用程序开发以及如何使用windows forms进行c++/cli windows应用程序开发... -
Visual C++ 2005入门经典--源代码及课后练习答案
2013-02-02 16:42:04本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,... -
Visual C++ 2005 入门经典 详细书签版
2013-02-02 16:39:43本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,... -
Visual Studio程序员箴言--详细书签版
2012-10-16 20:37:39技巧1.26 将宏绑定到键盘快捷键(或者说,如何快速增大或减小文本编辑器的字体大小) 17 1.3.2 字体和颜色 17 技巧1.27 将编辑器背景改为黑色 17 技巧1.28 “工具”→“选项”→“环境”→“字体和颜色”中... -
Spring面试题
2015-05-06 07:19:39在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用开启在线信用帐户的用例作为起点。对于该实现,... -
千里马酒店前台管理系统V7使用手册
2011-06-16 14:09:38如何避免排房冲突、如何确定房价等酒店业务规则,均在这一层中处理。 数据处理层的作用是直接与数据库管理系统DBMS连接,负责低层的数据处理和存贮过程。千里马V7.2采用MS-SQL SERVER 2000数据库系统,并充分... -
C#微软培训教材(高清PDF)
2009-07-30 08:51:17C#--微软.NET的第一语言 本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 ... -
C#微软培训资料
2014-01-22 14:10:17第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11 第二章 运行环境 全面了解.NET.... -
每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须...
-
比特币原理详解
-
一个简单的PHP在线书签系统
-
蓝桥杯练习-2.26
-
axios学习优化及使用
-
利用坐标变换分析塔差对编码器测角精度测试的影响
-
斜光轴数字强度相关计量的像模糊容限
-
深究字符编码的奥秘,与乱码说再见
-
移动界面隐喻设计
-
access应用的3个开发实例
-
MySQL 高可用工具 heartbeat 实战部署详解
-
产品团队管理经验一枚
-
Employee_Tracker_ManageYourCompany:BCS家庭作业周12-源码
-
Vue项目首页-iconfont的使用和代码优化(7-2)
-
2021-02-27
-
php底层运行机制与原理
-
为什么使用初始化列表会快一些?
-
敏捷个人:内容框架之执行力
-
09-JavaVM与JNIEnv
-
产品团队管理经验一枚
-
精益用户体验(UX):摆脱只注重结果的工作