Ответ 1
ListView.setSelection(position)
это приведет к прокрутке к выбранному элементу, вызовите это, когда u щелкните по элементу группы.
Я бы хотел, чтобы мой 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 |
+=================+ +=================+
ListView.setSelection(position)
это приведет к прокрутке к выбранному элементу, вызовите это, когда u щелкните по элементу группы.
Следующий код - это решение, которое сработало для меня
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);
}
Добавьте этот атрибут android:transcriptMode="disabled"
в свой тег ExpandibleListView из xml. Это должно работать.
Этот работает для меня
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);
Настройка android:transcriptMode="disabled"
для моего ExpandibleListView
тоже работала для меня. Если параметр установлен на "нормальный", ни один метод не работает (setSelectedGroup
, setSelectionFromTop
и т.д.).
Только setSmoothScroll
работает, но не нравится эффект.
Ниже приведен код для меня. Надеюсь, что он поможет. Устанавливает OnGroupExpandListener внутри onGroupExpand используйте приведенный ниже код
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);
}
});
}
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;
}
});