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 项。
问题解决。

上一篇 下一篇

猜你喜欢

热点阅读