Android: TODO 应用交互的两种实现方法(Behavior)
最近在写 TODO app,涉及到 Calendar 和 RecyclerView 的交互,
需求:
1. 往上滑动, Calendar 显示为周
2. 周显示模式下,往下滑动,显示为月
3. 列表下滑到第一个 item 的位置, Calendar 显示为周的时候,这时候改变为显示月
4. 列表上滑,Calendar 缩起来,显示为周,假如已经缩起来了,让列表滑动,显示更多的 item。
方法一:目前采用的是把 Calendar 和 RecyclerView 放在一个 LinearLayout 中,然后在 dispatchTouchEvent() 方法中根据上下滑动的手势进行了判断,然后让 Calendar 和 RecyclerView 进行交互。
方法二:目前看到另外一个新的解决办法是,使用 CoordinatorLayout 布局,然后自定义 Behavior,实现 Calendar 和 RecyclerView 的交互。
CalendarBehavior:
public class CalendarBehavior extends CoordinatorLayout.Behavior<MonthPager> {
private int mTop;
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, MonthPager child, View dependency) {
return dependency instanceof RecyclerView;
}
@Override
public boolean onLayoutChild(CoordinatorLayout parent, MonthPager child, int layoutDirection) {
parent.onLayoutChild(child, layoutDirection);
child.offsetTopAndBottom(mTop);
return true;
}
private int dependentViewTop = -1;
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, MonthPager child, View dependency) {
if (dependentViewTop != -1) {
int dy = dependency.getTop() - dependentViewTop; //dependency对其依赖的view(本例依赖的view是RecycleView)
int top = child.getTop();
if (dy > -top) {
dy = -top;
}
if (dy < -top - child.getTopMovableDistance()) {
dy = -top - child.getTopMovableDistance();
}
child.offsetTopAndBottom(dy);
}
dependentViewTop = dependency.getTop(); //dependency
mTop = child.getTop();
return true;
}
}
关于自定义 Behavior ,入门参考:http://blog.csdn.net/tabolt/article/details/51821933
链接:一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~:http://www.cnblogs.com/liushilin/p/6170735.html
Android: TODO 应用交互的两种实现方法(Behavior)的更多相关文章
- Android中H5和Native交互的两种方式
Android中H5和Native交互的两种方式:http://www.jianshu.com/p/bcb5d8582d92 注意事项: 1.android给h5页面注入一个对象(WZApp),这个对 ...
- android studio gradle 两种更新方法更新
android studio gradle 两种更新方法更新 第一种.Android studio更新 第一步:在你所在项目文件夹下:你项目根目录gradlewrappergradle-wrapper ...
- Flex(ActionScript)与JavaScript交互的两种方式示例
随着各单位部门信息化进程的不断发展,互通互联.共享协调不断的被越来越多的客户所重视.很多新项目都要去必须能够集成已有的早期系统,至少也要能够实现交互对接.今天跟大家分享的是系统对接中ActionScr ...
- 更新Android Studio,提示后直接点更新即可。gradle 两种更新方法,我用的第二种:手动添加gradle
直接更新即可. 更新完毕后,随即会让你更新gradle,但是会一直更新一直更新...... 解决方法: 第一种方法: 手动下载Android Studio 对应的 gradle版本,然后设置一下即可. ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- git两种合并方法 比较merge和rebase
18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用m ...
- 两种Ajax方法
两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...
- JavaScript监听手机物理返回键的两种解决方法
JavaScript没有监听物理返回键的API,所以只能使用 popstate 事件监听. 有两个解决办法: 1.返回到指定的页面 pushHistory(); window.addEventList ...
- 两种js方法发起微信支付:WeixinJSBridge,wx.chooseWXPay区别
原文链接:https://www.2cto.com/weixin/201507/412752.html 1.为什么会有两种JS方法可以发起微信支付? 当你登陆微信公众号之后,左边有两个菜单栏,一个是微 ...
随机推荐
- ZH奶酪:PHP安装扩展imagick
明明几个简单命令就能搞定,但是按照网上的方法就是不行,弄了一天,最后发现只需要两行命令,而且不需要修改什么php.ini: sudo apt-get install php5-imagick sudo ...
- ADO.Net 之 数据库连接池(二)
连接到数据库服务器通常由几个需要很长时间的步骤组成.必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事 ...
- 嵌入式web服务器-thttpd
交叉编译thttpd http://lakie.blog.163.com/blog/static/45185220201162910432330/ thttpd安装与调试 http://blog.cs ...
- JS模板语言不错的脚本
<html> <script src="template.js"></script> <head> </head> &l ...
- POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见 先把全部线段存下来 并按x ...
- 算法笔记_197:历届试题 带分数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. ...
- Using QuickExec
Fiddler's QuickExec box allows you to launch script-commands quickly. Keyboard Shortcuts Hit ALT+Q t ...
- TP自动生成模块目录
TP自动生成模块目录 例如我想在项目中增加一个AdminI模块 只需要在入口文件index.php中添加: define('BIND_MODULE','Admin'); 再访问127.0.0.1项目就 ...
- tar 归档中找不到
今天在解压tar.gz包时遇到的错误: 刚开始以为是路径的问题,然后感觉是tar.gz包的问题,后来查了一下才知道,记录一下: 一定要加上那个-C 参数表示更换目录的意识 -C --dire ...
- html页面禁止选择复制剪切
在body加入 onselectstart="return false" oncopy="return false;" oncut="return f ...