尊旭网
当前位置: 尊旭网 > 知识 >

expandablelistview

时间:2025-01-16 03:33:27 编辑:阿旭

使用ExpandableListView以及怎么优化view的显示减少内存占用

解决方案Github pull request链接:
Android的原生提供和展开分组的ListView:ExpandableListView,然而相比于iOS上原生提供的UITableView,其UI能力不足,比如没有原生的动画展开和收起效果支持。
在开源代码社区我们可以找到几个为Android的ExpandableListView添加的动画解决方案。其中idunnololz的AnimatedExpandableListView是不错的方案之一。 。它的优点:性能较好,提供源代码而不是library(这点很重要),注释清晰。
然而性能的优化是没有止境的,当分组内的子view(childView)变得复杂,或者ListView的parent结构复杂,例如内嵌与其它LinearLayout, FrameLayout或者ScrollView之中,并且parent的使用自定义的重写的onMeasure()方法时,生成childView的效率就会大大影响应用的性能。
合理使用AnimatedExpandableListView的关键是在于AnimatedExpandableListView#getRealChildView()的实现,这是应用开发的责任。实际项目中,通过优化getRealChildView(),动画效果的启动时间从1340ms减少到了680ms (展开一个含有5个子项目的分组)。而发现的问题的定位和解决方案,基本是用过使用Android提供的method tracing方法(android.os.Debug.startMethodTraceing)进行分析。
优化前的getRealChildView()实现,需要大量的view初始化,因为没有可用的convertView,而事实上,在动画绘制阶段时生成的childView完全可以被重用,及时convertView并为给出。如下面的traceview profile看到的,优化前,getChildView()消耗了超过一秒的时间。

优化后的性能:

这是如何做到的呢?这需要我们再研究一下动画展开的原理,也就是getChildView()里面耗时最长的是哪些动作。首先排除其他因素的影响,专注于AnimatedExpandableList本收得使用,我们使用GitHub上原生提供的Example来做分析:这是展开5个子项目的分组的情况,注意5个子分组的view生成,LayoutInflater.inflate被执行了10次,是其两倍。而inflate是相当耗时的。有没有方法来减少这部分工作消耗呢?

方法是使用Android推荐的LRU cache来保存childView的。关于LruCache,请见Android的reference documents和training。这里特别要注意的是,childView在dataSet改变时需要重新生成,而不是在cache中获得,这里使用的方法是判断childView的type。在自己的项目中需要根据情况认真考虑dataSet改变如何更新cache的问题。效果如下所示:inflate的次数减少到5次,一次都不浪费。消耗时间从160ms降低到80ms。


Android ExpandableListView使用小结(一)

ExpandableListView 是什么? 官方 给出的解释是: A view that shows items in a vertically scrolling two-level list. This differs from the ListView by allowing two levels: groups which can individually be expanded to show its children. The items come from the ExpandableListAdapter associated with this view. 简单翻译一下就是: 一种用于垂直滚动展示两级列表的视图,和 ListView 的不同之处就是它可以展示两级列表,分组可以单独展开显示子选项。这些选项的数据是通过 ExpandableListAdapter 关联的。 这个 ExpandableListAdapter 又是什么呢?和 ListView 使用的 BaseAdapter 差不多,都是用来给 View 提供数据、 实例化子布局的。实际使用的时候实现这个接口就可以了。 了解了这么多,我们来亲自实战一下。 到现在基本上完成了,我们来看一下运行效果~~ 在下篇文章 Android ExpandableListView使用小结(二) 中,我会分享有关 ExpandableListView 的 Indicator(指示器)的使用,欢迎各位围观~ Demo 地址: 点我飞往 GitHub~

安卓怎么实现expandablelistvew的子项滑动,group不滑动

ExpandableList怎样实现滑动子项时父项不动 ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。 重要方法: expandGroup (int groupPos) ;//在分组列表视图中 展开一组, setSelectedGroup (int groupPosition) ;//设置选择指定的组。 setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);//设置选择指定的子项。 getPackedPositionGroup (long packedPosition);//返回所选择的组 getPackedPositionForChild (int groupPosition, int childPosition) ;//返回所选择的子项 getPackedPositionType (long packedPosition);//返回所选择项的类型(Child,Group) isGroupExpanded (int groupPosition);//判断此组是否展开 expandableListView.setDivider();这个是设定每个Group之间的分割线。 expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。 expandableListView.collapseGroup(int group); 将第group组收起 ExpandableListAdapter 一个接口,将基础数据...


android expandablelistview 能不能滚动

ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。
重要方法:


expandGroup (int groupPos) ;//在分组列表视图中 展开一组,
setSelectedGroup (int groupPosition) ;//设置选择指定的组。

setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);//设置选择指定的子项。

getPackedPositionGroup (long packedPosition);//返回所选择的组

getPackedPositionForChild (int groupPosition, int childPosition) ;//返回所选择的子项

getPackedPositionType (long packedPosition);//返回所选择项的类型(Child,Group)

isGroupExpanded (int groupPosition);//判断此组是否展开


expandableListView.setDivider();这个是设定每个Group之间的分割线。
expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。

expandableListView.collapseGroup(int group); 将第group组收起
ExpandableListAdapter
一个接口,将基础数据链接到一个ExpandableListView。 此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。
1.重要方法
    getChildId (int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。
    getChildrenCount (int groupPosition) 返回在指定Group的Child数目。


android中怎么替换expandablelistview控件前面的箭头图标及修改高度

高度修改:修改的是当前组件所在的容器高度,如有个组别1,组别2,需要把这些组的高度农高些:
LayoutParams lp=new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,100);
//参数为宽度和高度,需要借助于LayoutParams修改,可以查看View类的方法即可找到这个方法。
TextView tv=new TextView(MainActivity.this);
tv.setLayoutParams(lp);