Android可展开ListView - 如何平滑滚动到组内的子位置?

3
我有一个可扩展的列表视图,其中一个分组“Group1”有15个子项。如何在单击并展开“Group1”时平滑地滚动到第10个子项?
谢谢。

检查这个答案: https://stackoverflow.com/a/74473330/5714364 - Praful C
1个回答

4

重写适配器的onGroupExpanded方法,并调用ExpandableListView的一个smoothScrollToPosition方法。示例如下:

@Override
public void onGroupExpanded(int groupPosition) {
    super.onGroupExpanded(groupPosition);
    // If it's the first group
    if (groupPosition == 0) {
        int scrollTo = groupPosition + 15;
        mExpList.smoothScrollToPositionFromTop(scrollTo, 0);
    }
}

现在要记住的是,如果在groupPosition之前还有其他展开的组,则scrollTo将必须考虑到这一点。因此,您可能希望将所有已展开的组位置(及其子项计数)保存到数组中并在每次调用onGroupExpandedonGroupCollapsed时循环遍历它们。

这个过程可能看起来像这样:

@Override
public void onGroupExpanded(int groupPosition) {
    super.onGroupExpanded(groupPosition);
    groupStates.put(groupPosition, 1);
    childrenCount.put(groupPosition, getChildrenCount(groupPosition));
    // Loop the group states
    int scrollTo = 0;
    for (int i=0; i<groupStates.size(); i++) {
        int position = groupStates.keyAt(i);
        // Cancel the loop if reached a further expanded group
        if (position > groupPosition) break;

        // 1 is the group to be skipped + its children count
        scrollTo += 1 + childrenCount.get(position);
    }
    // You can select specific child of the recently expanded group, to scroll to
    int childToScrollTo = 15; // make sure is an existing child
    // -1 because positions begin at index 1
    scrollTo = scrollTo - 1 + childToScrollTo;
    mExpList.smoothScrollToPositionFromTop(scrollTo, 0);
}

@Override
public void onGroupCollapsed(int groupPosition) {
    super.onGroupCollapsed(groupPosition);
    groupStates.remove(groupPosition);
    childrenCount.remove(groupPosition);
}

然而,此方法尚未经过测试,请确保您充分测试它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接