Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 633|回复: 0

开发交流:Android 类iphone的Expandable List View

[复制链接]

该用户从未签到

发表于 2011-10-24 09:12:30 | 显示全部楼层 |阅读模式
最近看到一些应用实现了iphone一样的Expandable ListView。如QQ for pad。本文探索和实现了相关的效果,一并附上源代码。欢迎实现和提交建议。
  先看看实现的效果图:     



布局设计

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


<RelativeLayout android:layout_width="match_parent"

android:id="@+id/relativeLayout1" android:layout_height="0dp"

android:layout_weight="10">         

<ExpandableListView android:layout_height="wrap_content"

android:layout_width="match_parent" android:id="@+id/expandableListView"

android:layout_alignParentTop="true" android:layout_alignLeft="@+id/linearLayout1"></ExpandableListView>

<LinearLayout android:layout_height="wrap_content"

android:layout_width="match_parent" android:id="@+id/topGroup"

androidrientation="vertical" android:layout_alignParentTop="true"

android:layout_alignParentLeft="true"

android:background="@drawable/group_bg"></LinearLayout>

</RelativeLayout>
复制代码


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




获取滑动的状态和位置

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


算法的逻辑

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


总结

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


重要的API:

  pointToPosition 通过指定的点,返回list的position
  getExpandableListPosition
  ExpandableListView.getPackedPositionChild
   ExpandableListView.getPackedPositionGroup
  通过上面的函数,可以在Expandable list和普通list中自由转换。也就是说,在Expandable list在绘图的时候,是先转换成为普通的List的。明白这个道理对解决ExpandableListView的问题有帮助。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 19:30 , Processed in 0.310095 second(s), 37 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表