AndroidでExpandableListViewの状態(折りたたまれているアイテムと折りたたまれていないアイテム)を保存して復元することは可能ですか?
可能であれば、どうすればそれを行うことができますか?
onPause() / onResume() で ExpandableListView にアクセスできますか?
AndroidでExpandableListViewの状態(折りたたまれているアイテムと折りたたまれていないアイテム)を保存して復元することは可能ですか?
可能であれば、どうすればそれを行うことができますか?
onPause() / onResume() で ExpandableListView にアクセスできますか?
グループを繰り返し処理し、それらすべての状態を保存します。
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);
onPause() / onResume() で ListView にアクセスする方法の意味がわかりません。ListView オブジェクトをアクティビティ クラスのメンバーとして格納すると、そこからアクセスできるはずです。
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 までスクロールされます。
このまったく同じ質問に出くわし、より良い答えを見つけました。フラグメントがあり、onSaveInstanceStateとonViewStateRestoredを使用してExpandableListViewを保存および復元します。
ここでリストの状態を保存します
@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() );
}
}
そして、ここで必要なときに復元します
@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 );
}
}
}