2016-04-06 3 views
1

Я пошел через знаменитое сообщение в SO, Maintain/Save restore scroll position , но не помогает мне вообще.Ориентация: восстановить позицию ListView, находящуюся внутри фрагмента

У меня есть ListView внутри фрагмента, если я изменяю ориентацию, я бы хотел, чтобы saveInstance Bundle сохранил мою позицию. У меня есть

private static final String LIST_STATE = "listState"; 
private Parcelable mListState = null; 

@Override 
public void onSaveInstanceState(Bundle outState) { 

    super.onSaveInstanceState(outState); 

    mListState = listView.onSaveInstanceState(); 
    outState.putParcelable(LIST_STATE, mListState); 

    } 

и не имеет значения, если я ставлю в OnCreateView или onActivityCreated следующего кода

if(savedInstanceState!=null) { 
     mListState = savedInstanceState.getParcelable(LIST_STATE); 
     listView.onRestoreInstanceState(mListState); 

позицию вверх список не восстанавливаются вообще. можно легко увидеть из отладки в Bundle, что отладки распознает в Bundle положение,

AbsListView.SavedState {3d7562e0 selectedId = -9223372036854775808 FirstId = 25 viewTop = -38 положение = 5 высота = 717 фильтр = нулевой CheckState = нуль}

Я даже пытался извлечь из Bundle этого положения в изолированно, а не всех ценности, но без успеха.

ответ

1

Нашел!

Решение

@Override 
    public void onSaveInstanceState(Bundle outState) { 

     super.onSaveInstanceState(outState); 

mPosition2=listView.getFirstVisiblePosition(); 

if(mPosition2!=0) { 
    mPosition = mPosition2; 
} 

     if (mPosition != ListView.INVALID_POSITION) { 
      outState.putInt(SELECTED_KEY, mPosition); 
     } 
     } 

и onCreateView

if (savedInstanceState != null && savedInstanceState.containsKey(SELECTED_KEY)) { 
      mPosition = savedInstanceState.getInt(SELECTED_KEY); 

     } 

наконец у меня есть загрузчик, который запроса поставщика контента в конце onLoadFinished (но вы можете поставить вас именно там, где вам нужно)

if (mPosition != ListView.INVALID_POSITION) { 

     listView.setSelection(mPosition); 

Я также попробовал listView.smoothScrollToPosition (mpososition) , но на данный момент он не работает, но неважно, что это работает очень хорошо для меня.

1

добавить следующий код внутри фрагмента

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 
+0

Большое спасибо за ваш интерес, но если я вызову setRetainInstance (true), ListView исчезнет, ​​если я изменил поворот – trocchietto

Смежные вопросы