Вопрос по android – Как сохранить и восстановить состояние ExpandableListView в Android?

2

Можно ли сохранить и восстановить состояние (какие элементы свернуты, а какие нет) ExpandableListView в Android?

Если это возможно, как я могу это сделать?

Могу ли я получить доступ к ExpandableListView в onPause () / onResume () и как?

Ваш Ответ

4   ответа
0

более простой способ может быть, если вы используете setOnGroupClickListner и setOnChildClickListener, просто сохраняете последние выбранные целочисленные значения ChildPosition и GroupPositin, а затем проверяйте их и отвечайте правильно,

if (childPosition > 0) {
    mExpandableList.expandGroup(groupPositin);
}
mExpandableList.setItemChecked(groupPositin + childPosition , true);

вам просто нужно помнить, чтобы установить childPosition в 0 в вашем методе setOnGroupListener.

0

Я столкнулся с тем же вопросом и нашел лучший ответ. У меня есть фрагмент и используюonSaveInstanceState а такжеonViewStateRestored сохранить и восстановитьExpandableListView.

Here I save the state of the list

@Override
public void onSaveInstanceState( @NonNull Bundle outState )
{
    super.onSaveInstanceState( outState );

    ExpandableListView expandable = getView() != null ? getView().findViewById( R.id.expandable ) : null;
    if( expandable != null )
    {
        int groupsCount = expandable.getExpandableListAdapter()
                                    .getGroupCount();
        boolean[] groupExpandedArray = new boolean[groupsCount];
        for( int i = 0; i < groupsCount; i += 1 )
        {
            groupExpandedArray[i] = expandable.isGroupExpanded( i );
        }
        outState.putBooleanArray( "groupExpandedArray", groupExpandedArray );
        outState.putInt( "firstVisiblePosition", expandable.getFirstVisiblePosition() );
    }
}

And here I restore it when it is needed

@Override
public void onViewStateRestored( @Nullable Bundle savedInstanceState )
{
    super.onViewStateRestored( savedInstanceState );
    if( savedInstanceState != null )
    {
        boolean[]          groupExpandedArray   = savedInstanceState.getBooleanArray( "groupExpandedArray" );
        int                firstVisiblePosition = savedInstanceState.getInt( "firstVisiblePosition", -1 );
        ExpandableListView expandable           = getView() instanceof ViewGroup ? getView().findViewById( R.id.expandable ) : null;
        if( expandable != null && groupExpandedArray != null )
        {
            for( int i = 0; i < groupExpandedArray.length; i++ )
            {
                if( groupExpandedArray[i] )
                    expandable.expandGroup( i );
            }
            if( firstVisiblePosition >= 0 )
                expandable.setSelection( firstVisiblePosition );
        }
    }
}
3

Улучшение ответа Floaf: объявлять

 public static int firstVisiblePosition=0;

на паузе

int numberOfGroups = MyExpandableListViewAdapter.getGroupCount();
boolean[] groupExpandedArray = new boolean[numberOfGroups];
for (int i=0;i<numberOfGroups;i++){
    groupExpandedArray[i] = MyExpandableListView.isGroupExpanded(i);
}
firstVisiblePosition = MyExpandableListView.getFirstVisiblePosition();

onResume

for (int i=0;i<groupExpandedArray.length;i++){
  if (groupExpandedArray[i] == true)
      MyExpandableListView.expandGroup(i);
}
MyExpandableListView.setSelection(firstVisiblePosition );

Это будет не только восстанавливать состояние каждой группы, но также прокручивать до childView, который просматривался при приостановке активности.

4

Я перебираю группы и сохраняю их состояние:

int numberOfGroups = MyExpandableListViewAdapter.getGroupCount();
boolean[] groupExpandedArray = new boolean[numberOfGroups];
  for (int i=0;i<numberOfGroups;i++)
    groupExpandedArray[i] = MyExpandableListView.isGroupExpanded(i);

Тогда для восстановления состояния:

for (int i=0;i<groupExpandedArray.length;i++)
  if (groupExpandedArray[i] == true)
    MyExpandableListView.expandGroup(i);

Я не понимаю, что вы подразумеваете под тем, как получить доступ к ListView в onPause () / onResume (), он должен быть доступен оттуда, если вы сохраняете объект ListView в качестве члена класса активности.

Да Floaf, нашел это решение уже ... :) mrd

Похожие вопросы