Android 在ExpandableListView中自动滚动
我希望我的Android 在ExpandableListView中自动滚动,android,scroll,expandablelistview,Android,Scroll,Expandablelistview,我希望我的ExpandableListView在用户展开组时自动滚动,以便展开的组标题位于屏幕顶部。我已经尝试了smoothScrollToPosition,但这只是确保扩展组在屏幕上的某个位置可见。我想显式滚动它,使扩展组位于顶部,如本例所示: Before expanding Group 3: After expanding Group 3: +=================+ +=================
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 |
+=================+ +=================+
这将滚动到所选项目,
单击组项时调用此属性。从xml将此属性添加到ExpandibleListView标记中。这应该行得通。将
android:transcriptMode=“disabled”
设置到我的ExpandibleListView
也行得通。当参数设置为“正常”时,没有任何方法工作(setSelectedGroup
,setSelectionFromTop
等)
只有
setSmoothScroll
可以工作,但不喜欢它的效果。下面的代码是一个适合我的解决方案
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;
}
这对我有用。将其放入适配器:
public void onGroupExpanded(final int groupPosition) {
super.onGroupExpanded(groupPosition);
listView.setSelectedGroup(groupPosition);
}
下面的代码对我很有用。希望能有所帮助。使用下面的代码在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);
}
});
}这个对我有用
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);
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;
}
});
使用平滑滚动动画可以实现同样的效果吗?如果您使用
parent.expandGroup(groupPosition,true)
则动画将自动进行,而您不必自己执行,这可能会帮助您实现平滑滚动(但您可能需要计算列表中每个项目的高度)。
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;
}
});