可扩展列表视图中的自动滚动功能

18

当用户展开组时,我希望我的ExpandableListView自动滚动,使展开的组头部在屏幕顶部。我已经尝试使用smoothScrollToPosition,但这只是确保展开的组在屏幕上某个位置可见。我想显式地滚动,使展开的组在屏幕顶部,就像这个例子中一样:

Before expanding Group 3:                After expanding Group 3:

+=================+                      +=================+
| Group 1         |                      | Group 3         |
+-----------------+                      +-----------------+
| Group 2         |                      |   Grp 3 Child 1 |
+-----------------+                      +-----------------+
| Group 3         |                      |   Grp 3 Child 2 |
+-----------------+                      +-----------------+
| Group 4         |                      | Group 4         |
+=================+                      +=================+
8个回答

18
ListView.setSelection(position)

当你点击组项时,这将滚动到所选项目,请在此时调用。


是否可以通过平滑滚动动画来实现相同的效果? - 7heViking
也许这可以帮助您实现平滑滚动 https://dev59.com/fWsz5IYBdhLWcg3wZm3Q#7929080 (但您可能需要计算列表中每个项目的高度) - Lars Werkman

6
以下代码是我使用的解决方案。
public boolean onGroupClick(ExpandableListView parent, View v,int groupPosition, long id) {
    // TODO Auto-generated method stub
    //mExpandableList.setSelectionFromTop(groupPosition, 0);

Boolean shouldExpand = (!mExpandableList.isGroupExpanded(groupPosition));        
    mExpandableList.collapseGroup(lastClickedPosition);

    if (shouldExpand){
        //generateExpandableList();
        mExpandableList.expandGroup(groupPosition);
        mExpandableList.setSelectionFromTop(groupPosition, 0);
    }                
    lastClickedPosition = groupPosition;
    return true;        
}

6

这个对我有用。将它放在你的适配器中:

public void onGroupExpanded(final int groupPosition) {
    super.onGroupExpanded(groupPosition);

    listView.setSelectedGroup(groupPosition);
}

3
这个对我有效。
expandList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

            if (!parent.isGroupExpanded(groupPosition)) {
                parent.expandGroup(groupPosition);
            } else {
                parent.collapseGroup(groupPosition);
            }
            parent.setSelectedGroup(groupPosition);

            return true;
        }
    });

滚动条的主要工作部分是

parent.setSelectedGroup(groupPosition);

1
如果您使用 parent.expandGroup(groupPosition, true),则动画将自动发生,您无需自己执行。 - ben

2
在XML中,将android:transcriptMode="disabled"属性添加到您的ExpandibleListView标签中即可。这样应该就可以了。

0
下面的代码对我来说是有效的。希望它能有所帮助。在onGroupExpand中实现OnGroupExpandListener,使用下面的代码。
public void onGroupExpand(final int groupPosition) {
super.onGroupExpand(groupPosition);

expandableListView.post(new Runnable() {

    @Override
    public void run() {
        expandableListView.setSelection(groupPosition);
        if(expandableListView.getChildAt(groupPosition)!=null)
        expandableListView.requestChildRectangleOnScreen(expandableListView.getChildAt(groupPosition),
                new Rect(0, 0, expandableListView.getChildAt(groupPosition).getRight(), expandableListView.getChildAt(groupPosition).getHeight()), false);
    }
});

}


0

setSelectedGroup 可以使用,但如果想要平滑滚动的效果,请使用以下代码中提供的 smoothScrollToPositionFromTop

    expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            parent.smoothScrollToPositionFromTop(groupPosition,0);
            if (expandableListView.isGroupExpanded(groupPosition))
                expandableListView.collapseGroupWithAnimation(groupPosition);
            else expandableListView.expandGroupWithAnimation(groupPosition);
            return true;
        }
    });

0

android:transcriptMode="disabled"设置到我的ExpandibleListView中对我也起作用。如果将参数设置为“normal”,则没有一种方法可以正常工作(setSelectedGroupsetSelectionFromTop等)。

只有setSmoothScroll可以工作,但我不喜欢这种效果。


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