热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android类iphone的ExpandableListView

最近看到一些应用实现了iphone一样的ExpandableListView。如QQforpad。本文探索和实现了相关的效果,一并附上源代码。欢迎实现和提交建议。先看看实现的效果图

  最近看到一些应用实现了iphone一样的Expandable ListView。如QQ for pad。本文探索和实现了相关的效果,一并附上源代码。欢迎实现和提交建议。

  先看看实现的效果图:     

Android 类iphone的Expandable List View

  • 布局设计

  开始我采用的是一般的拖曳方面来做,也就是通过WindowManage创建一个顶层的窗口,然后实时更新这个窗口。但是仔细分析一下,发现这样做有些弊端:首先,如果Expandable List如果可以拖曳的话,再要跟这个top window进行同步就不好处理了。其次,拖曳的处理方面需要获得被拖曳对象的缓存图片,而本文设计的情况在从下往上滑的时候有可能处理的对象还没有画处理,这样就无从有缓存图片了。

  好吧,不必把事情想得这么复杂,要什么高级的拖曳手段来实现。简单点,看下面的布局: 

 1 <RelativeLayout android:layout_width="match_parent"
2 android:id="@+id/relativeLayout1" android:layout_height="0dp"
3 android:layout_weight="10">
4 <ExpandableListView android:layout_height="wrap_content"
5 android:layout_width="match_parent" android:id="@+id/expandableListView"
6 android:layout_alignParentTop="true" android:layout_alignLeft="@+id/linearLayout1">ExpandableListView>
7 <LinearLayout android:layout_height="wrap_content"
8 android:layout_width="match_parent" android:id="@+id/topGroup"
9 android:orientation="vertical" android:layout_alignParentTop="true"
10 android:layout_alignParentLeft="true"
11 android:background="@drawable/group_bg">LinearLayout>
12 RelativeLayout>

  用一个RelativeLayout把两个布局重叠在一起,LinearLayout覆盖在ExpandableList上面。效果看总体效果图图 

  

  •  获取滑动的状态和位置

  下面要解决的一个问题是,这Indicator Group位置是可变的,当本分组快要显示完得时候,有一个上移的过程。所以要及时的更新它的位置。研究完ExpandableListViewAPI,我决定使用listView.setOnScrollListener(this);通过监听这个事件,可以及时更新位置

 

  • 算法的逻辑

  List view的(00)点所在的group的内容显示在Indicator Group

  Indicator Groupbottom不能超过,所在分组的bottom,换句话说,不能覆盖到下一个分组的top线。计算方法是获得(0indicatorGroupHeight)所在的Group,如果和Indicator Group不同一个分组,就获得它的top位置,也就是图中的A点。这就可以计算出来Indicator 应该向上margin多少了

 

  • 总结

  这里简单实现了思路,在实际使用中,不同的情况还出现一些问题,需要另外找方法解决。代码附上 (如果下载不了,请留言)

 

  • 重要的API

  pointToPosition 通过指定的点,返回listposition

  getExpandableListPosition

  ExpandableListView.getPackedPositionChild

   ExpandableListView.getPackedPositionGroup

  通过上面的函数,可以在Expandable list和普通list中***转换。也就是说,在Expandable list在绘图的时候,是先转换成为普通的List的。明白这个道理对解决ExpandableListView的问题有帮助。


推荐阅读
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • 今日份分享:Flutter自定义之旋转木马
    今日份分享:Flutter自定义之旋转木马-先上图,带你回到童年时光:效果分析子布局按照圆形顺序放置且平分角度子布局旋转、支持手势滑动旋转、快速滑动抬手继续旋转、自动旋转支持X轴旋 ... [详细]
author-avatar
被盗不玩了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有