说到苹果的卡片布局我就想起当年我的挚爱--web OS系统了。在功能机转换到智能机的时代,Web oS系统是那样的出类拨萃,傲压群雄,只可惜现在流落到只能在电视上才能看到他的身影了。记得我的第一台智能手机就是诺基亚的N81,为了这台手机,我花掉了我的全部奖学金,还跟家里说谎掉钱了。一心只读圣年书的我,从QQ都不知道掉进了智能手机的坑。

在被诺基亚N81深深吸引的我很快就被Paml pixi这款手机迷倒了。多后台,卡片式管理,动感的“小彩虹菜单”,迷人的便签,还有那个酷帅的手势操作,前卫的点金石无线充电。接着就是Paml pixi plus-->Pre-->Pre plus-->Pre2-->Pre3-->I touch.很快全都落尽我的怀里。然后就在各种论坛折腾,那种乐趣只能剩下回忆了。在web OS被HP抛弃后,才慢慢接触了黑莓8830,苹果,最后才是android。不得不说,Android的开源给了他强大的生命力。

曾几何时,我希望用Android系统复活Web OS,至少能把他的UI设计传承下来。于是想尽办法设计开发了一整套UI出来,在大学的时候,导师对我的作品非常给了很大的鼓励。

如今,Android已不是当年所可以比拟的了,各种开源的如汗牛充栋。各种开发控件及UI设计,简直就是淋漓满目。特效更是流畅动感。这里说说v7的RecyclerView吧。RecyclerView的拓展能力非常优秀。不仅替代了传统的ListView,GridView,还为瀑布流这种怪异的布局的实现变得非常方便。之前还在为滑动删除,拖动换位这样的控件搞的焦头烂额,如今就仅仅是几句代码的事情了。最近我就用ReCyclerView变着法子来实现WEB OS的几个经典UI(代码比较粗糙)

让我们看看RecyclerView的神奇之处吧:

在这里要涉及到几个类,RecyclerView,ItemTouchHelper,ItemTouchHelper.Callback,LinearLayoutManager,RecyclerView.Adapter,RecyclerView.ViewHolder等。

首先,你要是现实ItemTouchHelper.Callback这个抽象类,实现里面的抽象方法

getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)   //配置可以拖动的方向和是否可以被滑动删除,UP,DOWN,LEFT,RIGHT表示四个方向,START,END表示删除的动作方向。

onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)   //交换的时候被调用

onSwiped(RecyclerView.ViewHolder viewHolder, int direction)    //移除的时候被调用

onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)      // 选中的ITEM发生改变被调用

clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)      //取消选中状态被调用

然后

ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback();  //实例化Callback

itemTouchHelper = new ItemTouchHelper(callback);   //实例化

itemTouchHelper.attachToRecyclerView(recyclerView);   //绑定RecyclerView

就这样一个可拖动Item,滑动item移除的ListView就搞定了。当然,基本的适配器,设置竖线线性布局还是很有必要的。

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback{private DragEvent mEvent;public SimpleItemTouchHelperCallback(DragEvent event){this.mEvent = event;}@Overridepublic boolean isItemViewSwipeEnabled() {return super.isItemViewSwipeEnabled();}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;final int swipFlags = ItemTouchHelper.START | ItemTouchHelper.END;return makeMovementFlags(dragFlags,swipFlags);}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {if(viewHolder.getItemViewType() != target.getItemViewType()) return false;mEvent.onItemSwap(viewHolder.getAdapterPosition(),target.getAdapterPosition());return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {mEvent.onItemRemove(viewHolder.getAdapterPosition());}@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {if(actionState != ItemTouchHelper.ACTION_STATE_IDLE){if(viewHolder instanceof OnViewHolderStatChanageListener){if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){OnViewHolderStatChanageListener listener = (OnViewHolderStatChanageListener)viewHolder;listener.onItemSelectedSwiped();}else if(actionState == ItemTouchHelper.ACTION_STATE_DRAG){OnViewHolderStatChanageListener listener = (OnViewHolderStatChanageListener)viewHolder;listener.onItemSelectedDrag();}}}super.onSelectedChanged(viewHolder, actionState);}@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);if(viewHolder instanceof OnViewHolderStatChanageListener){OnViewHolderStatChanageListener listener = (OnViewHolderStatChanageListener)viewHolder;listener.onItemNormal();}}
}

在这里我还定义了一个接口,DragEvent,为了我以后可以再其他地方干一些事。同样,这个类的实现同样适用表格布局的RecyclerView。那个便签就是那样实现的。

然而事情才刚刚开始。我想,如果把RecyclerView设置为横向线性布局呢?是不是同样适用呢?怀着猜想的尝试了下,发现问题了,横线的Item可以交换位置,却不能竖向删除。其实从

getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)这个方法的视线可以看出:

int  dragFlags 表示Item的可移动方向;

int  swipFlags 表示Item删除操作的方向;

只需要把Start | End 换成 UP | Down 即可。横线的RecyclerView是不是很像那个卡片布局的样子了?再对Item的布局做一下调整就OK了。看起来比UC浏览器的卡片页面高端多了,那个还不能调整页的顺序,这个一点压力也没有。RecyclerView其实还有很多妙用,之前就在网看到有人用RecyclerView做柱形图,这样的脑洞想不佩服都不行。

有句话说,方法总比困难多。我想问题的时候总会习惯性的去想想有没有别的途径或者方法可以实现。很多人一看到不规则的UI的时候就会想到如何从写控件,事件分发,事件拦截,事件分析,布局分配,视图重绘等机械式的思考过程,这样就不会有创新可言了。不管怎么样,多一种思路就多一种出路。有时候可以想想,比如线程安全有哪些类或者那些方式可以实现,比如,Vector,Collection.synchronizedList(),Thread.join(),synchronized关键字,CountDownLatch,ReentrantLock,Handler等。有时候觉得编程很写文章有点类似,会的词汇多了,写出来的文章多烂都不觉得那么乏味。

后续:http://blog.csdn.net/rj113/article/details/65660756

用RecyclerView来实现苹果后台样式的卡片布局相关推荐

  1. 简明的后台样式查询模板

    简介: 简明的后台样式查询模板 网盘下载地址: http://kekewl.cc/eZJzX6XTiyv0 图片:

  2. WEB安全之PHP安全开发 博客系统(二):前台js登陆验证、套用模板主体修改登陆和后台样式

    WEB安全之PHP安全开发 博客系统(二):前台js登陆验证.套用模板主体修改登陆和后台样式 前台验证 模板的套用 后台模板的套用 前台验证 做自动提交 点击登陆,自动提交 如果等于false,不会提 ...

  3. elementui 搭建布局页面路由_【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界面布局...

    前言 大家都知道,后台管理界面不需要很酷炫的动画效果,也不需要花里胡哨的界面布局,只需要简洁易用.清爽明了的界面以便于管理数据.而现在普遍的后台管理系统的界面布局都差不多,上中下结构,然后左边是导航栏 ...

  4. 【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界面布局

    前言 大家都知道,后台管理界面不需要很酷炫的动画效果,也不需要花里胡哨的界面布局,只需要简洁易用.清爽明了的界面以便于管理数据.而现在普遍的后台管理系统的界面布局都差不多,上中下结构,然后左边是导航栏 ...

  5. 9.后台管理系统主页面布局以及左侧导航栏设计

    9.后台管理系统主页面布局以及左侧导航栏设计 1.首页布局 步骤: 在views目录下新建Main.vue文件,作为登录之后的布局 参考:element-ui 使用此模块的目的是,当中间内容部分有超出 ...

  6. html卡片布局样式,基于bootstrap卡片图文列表布局样式

    特效描述:基于bootstrap 卡片图文列表 布局样式.bootstrap卡片图文列表布局代码是一款基于jQuery跟Bootstrap实现的3种列表布局样式代码. 代码结构 1. 引入CSS 2. ...

  7. 卡片布局样式弹出页面html页面前端源码[20226]

    大家好,今天给大家介绍一款,卡片布局样式弹出页面html页面前端源码(图1).送给大家哦,获取方式在本文末a尾. 图1 点击卡片会弹出相应子页面,四种卡片弹出四种不同的页面布局(图2) 图2 源码完整 ...

  8. HTML客户案例卡片布局样式

    下载地址HTML客户案例卡片布局样式,精美的css3鼠标悬停图文伸展展示布局特效,图文卡片还有好看的背景透明效果. dd:

  9. 微信小程序之获取后台动态数据表格布局display:table

    微信小程序之获取后台动态数据表格布局display:table 猿来独往 2018-09-02 本文没有采用flex布局和grid布局来设置表格的,而是通过 display: table;来设置. 一 ...

最新文章

  1. ibm服务器报错代码大全_微信认证订阅号开发者模式服务器配置自定义菜单PHP独立完整版...
  2. 面向对象分析和设计(OOA/D)
  3. 【Python】部分基础+Flask/JSON/....+零碎笔记
  4. 设计模式之UML类图
  5. 爱因斯坦为什么不是普通人?看他怎么喝茶就明白了,差距太明显了!没法比.......
  6. python给矩阵赋值_解决Python二维数组赋值问题
  7. 这不应该是19岁女孩的结局,这不应该是围观者该有的表达!
  8. pytest测试框架(六)---使用skip和skipif跳过测试用例
  9. 从程序员到项目经理:原来一切问题都是可以解决的
  10. 推荐几款好用的CRM
  11. 流程机器人 RPA:AI落地的接盘侠 | 甲子光年
  12. vs2010中外联qt,使用qt编程
  13. java+mysql 基于ssm205网上购物超市系统#毕业设计
  14. QCalendarWidget 日历控件
  15. PHP有哪些基本数据类,PHP的基本数据类型
  16. 如何通过云解析DNS,5步帮你实现邮箱解析
  17. 机器学习——建筑能源得分预测
  18. 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算2
  19. Linux arm 下载程序,在Linux下使用kermit和dnw给ARM板下载程序
  20. Win11怎么改系统语言?Win11系统语言简体改繁体的方法

热门文章

  1. linux开源网络教学系统,10 个顶尖的 Linux 开源人工智能工具
  2. python中config什么意思,使用Python中的config配置
  3. 忘记iCloud密码的解决方案 - 仅适用于iOS 7.1以前(不含)
  4. 用js实现简单的图书管理系统
  5. 编写程序,提示用户输入月份和年份,然后显示这个月的天数.
  6. day008--mysql中的字符串函数
  7. 结构化建模方法和工具
  8. (五)使用上述四种模式的一般原则
  9. 苹果新手Mac OS X 使用笔记--------系统自带截屏功能快捷键巧记图
  10. Spring入门详解