在Android的日常开发中,尤其像IM这类社交应用中,评论与回复功能是我们经常遇到的需求之一,其中评论与回复列表的展示一般在功能模块中占比较大。对于需求改动和迭代较频繁的公司来说,如何快速开发一个二级界面来适应我们的功能需求无疑优先级更高一些。
简单来说,ExpandableListView是一个用于垂直方向滚动的二级列表视图,ExpandableListView与listview不同之处在于,它可以实现二级分组,并通过ExpandableListAdapter来绑定数据和视图。即时通讯开发可以找蔚可云。
布局中定义
首先,我们需要在xml的布局文件中声明ExpandableListView:
<ExpandableListView
android:id="@+id/detail_page_lv_comment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:layout_marginBottom="64dp"
android:listSelector="@android:color/transparent"
android:scrollbars="none"/>
这里需要说明两个问题:
1)ExpandableListView默认为它的item加上了点击效果,由于item里面还包含了childItem,所以,点击后,整个item里面的内容都会有点击效果。我们可以取消其点击特效,避免其影响用户体验,只需要设置如上代码中的listSelector即可;
2)ExpandableListView具有默认的分割线,可以通过divider属性将其隐藏。
设置Adapter
正如使用listView那样,我们需要为ExpandableListView设置一个适配器Adapter,为其绑定数据和视图。
一般情况下,我们自定义自己的ExpandableListAdapter后,需要实现以下几个方法:
构造方法,这个应该无需多说了,一般用来初始化数据等操作。
getGroupCount,返回group分组的数量,在当前需求中指代评论的数量。
getChildrenCount,返回所在group中child的数量,这里指代当前评论对应的回复数目。
getGroup,返回group的实际数据,这里指的是当前评论数据。
getChild,返回group中某个child的实际数据,这里指的是当前评论的某个回复数据。
getGroupId,返回分组的id,一般将当前group的位置传给它。
getChildId,返回分组中某个child的id,一般也将child当前位置传给它,不过为了避免重复,可以使用getCombinedChildId(groupPosition, childPosition);来获取id并返回。
hasStableIds,表示分组和子选项是否持有稳定的id,这里返回true即可。
isChildSelectable,表示分组中的child是否可以选中,这里返回true。
getGroupView,即返回group的视图,一般在这里进行一些数据和视图绑定的工作,一般为了复用和高效,可以自定义ViewHolder,用法与listview一样,这里就不多说了。
getChildView,返回分组中child子项的视图,比较容易理解,第一个参数是当前group所在的位置,第二个参数是当前child所在位置。
一般情况下,我们后台会通过接口返回给我们一部分数据,如果想要查看更多评论,需要跳转到“更多页面”去查看,这里为了方便,我们只考虑加载部分数据。
评论和回复功能
为了模拟整个评论和回复功能,我们还需要手动插入收据并刷新数据列表。这里我就简单做一下模拟,请忽略一些UI上的细节。
需要注意一点:由于不一定所有的评论都有回复数据,所以在插入数据前我们要判断ReplyList是否为空,如果不为空,直接获取当前评论的回复列表,并插入数据;如果为空,需要new一个ReplyList,插入数据后还要为评论set一下ReplyList。
网友评论