ExpandableListView展开折叠列表滚动到指定位置的
2020-03-21 本文已影响0人
kongzue
需求
现有一需求,通讯录,需要各组区分(Group),点击组标题展开后显示该部门下的员工,但存在一个问题,需要能够通过一个 EditText 搜索其中的员工并滚动到指定位置。
问题在哪
原生的 ExpandableListView 并未提供滚动到第几组第几个的方法,而是保留了 ListView 的 smoothScrollToPosition 方法,但 ListView 的 smoothScrollToPosition 方法只能滚动到单列表情况下的第几项,而对于这种分组折叠展开的列表无能为力。
解决方案
我估摸着,这种折叠列表,实际上标题算一个item,每个展开的子项算一个item,循环遍历,如果上一个组没展开,那也得有一个标题对吧,就+1,如果展开了,就是1个标题+内容,最后再加上当前组目标item的位置,丢给 ListView 去滚动应该就可以了。
尝试
重写 ExpandableListView:
/**
* @author: Kongzue
* @github: https://github.com/kongzue/
* @homepage: http://kongzue.com/
* @mail: myzcxhh@live.cn
* @createTime: 2020/3/21 15:33
*/
public class AddressListView extends ExpandableListView {
public AddressListView(Context context) {
super(context);
}
public AddressListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AddressListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public AddressListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void scroll(int groupIndex, int childIndex) {
int position = 0;
for (int i = 0; i < groupIndex; i++) {
position++;
if (isGroupExpanded(i)){
position = position + getExpandableListAdapter().getChildrenCount(i);
}
}
position++;
position = position + childIndex;
super.smoothScrollToPosition(position);
}
}
提供方法 scroll(int groupIndex, int childIndex),指定滚动到第 groupIndex 组中的第 childIndex 项。
问题解决。