热门标签 | 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的问题有帮助。


推荐阅读
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • Android开发技巧:使用IconFont减少应用体积
    本文介绍如何在Android应用中使用IconFont来显示图标,从而有效减少应用的体积。 ... [详细]
  • 在Android开发中,当TextView的高度固定且内容超出时,可以通过设置其内置的滚动条属性来实现垂直滚动功能。具体来说,可以通过配置`android:scrollbars="vertical"`来启用垂直滚动,确保用户能够查看完整的内容。此外,为了优化用户体验,建议结合`setMovementMethod(ScrollerMovementMethod.getInstance())`方法,使滚动操作更加流畅和自然。 ... [详细]
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社区 版权所有