Автоматическая прокрутка в ExpandableListView - программирование
Подтвердить что ты не робот

Автоматическая прокрутка в ExpandableListView

Я бы хотел, чтобы мой 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         |
+=================+                      +=================+
4b9b3361

Ответ 1

ListView.setSelection(position)

это приведет к прокрутке к выбранному элементу, вызовите это, когда u щелкните по элементу группы.

Ответ 2

Следующий код - это решение, которое сработало для меня

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;        
}

Ответ 3

Это сработало для меня. Поместите его в адаптер:

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

    listView.setSelectedGroup(groupPosition);
}

Ответ 4

Добавьте этот атрибут android:transcriptMode="disabled" в свой тег ExpandibleListView из xml. Это должно работать.

Ответ 5

Этот работает для меня

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);

Ответ 6

Настройка android:transcriptMode="disabled" для моего ExpandibleListView тоже работала для меня. Если параметр установлен на "нормальный", ни один метод не работает (setSelectedGroup, setSelectionFromTop и т.д.).

Только setSmoothScroll работает, но не нравится эффект.

Ответ 7

Ниже приведен код для меня. Надеюсь, что он поможет. Устанавливает 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);
    }
});

}

Ответ 8

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;
        }
    });