2016-04-12 2 views
11

У меня есть вид Recycler, который лежит внутри SwipeRefreshLayout. Кроме того, есть возможность открывать каждый элемент в другом действии. После возвращения обратно в Recycler мне нужно прокрутить выбранный элемент или к предыдущему Y. Как это сделать?Как сохранить положение прокрутки RecyclerView в Android?

Да, я googled, нашел статьи в StackOverFlow о сохранении экземпляра менеджера макета, как этот: RecyclerView store/restore state between activities. Но это мне не помогает.

UPDATE

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

private int scrollPosition; 

...//onViewCreated - it is fragment 
recyclerView.setHasFixedSize(true); 
LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
recyclerView.setLayoutManager(llm); 
data = new ArrayList<>(); 
adapter.setData(getActivity(), data); 
recyclerView.setAdapter(adapter); 
... 

@Override 
public void onResume() { 
    super.onResume(); 
    recyclerView.setScrollY(scrollPosition); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    scrollPosition = recyclerView.getScrollY(); 
} 

Да, я пробовал scrollTo (int, int) - doen't work.

Теперь я пробовал просто прокрутить, например, до Y = 100, но он вообще не прокручивается.

+1

Пожалуйста размещаете код & что вы достигли до сих пор. – yennsarah

+0

Возможный дубликат [как сохранить позицию прокрутки recyclerview, с recyclerview.state или нет) (http://stackoverflow.com/questions/27816217/how-to-save-recyclerview-scroll-position-with-recyclerview-state- или-нет) –

+0

@MadhukarHebbar Я проверил его, и он тоже не работает ... – DefaultXYZ

ответ

29

Сохранить текущее состояние зрения рецикла позиции @ onPause:

positionIndex= llManager.findFirstVisibleItemPosition(); 
    View startView = rv.getChildAt(0); 
    topView = (startView == null) ? 0 : (startView.getTop() - rv.getPaddingTop()); 

Восстановление позиции прокрутки @onResume:

if (positionIndex!= -1) { 
     llManager.scrollToPositionWithOffset(positionIndex, topView); 
    } 

так или иначе может быть @onPause:

long currentVisiblePosition = 0; 
currentVisiblePosition = ((LinearLayoutManager)rv.getLayoutManager()).findFirstCompletelyVisibleItemPosition(); 

восстановления @onResume:

((LinearLayoutManager) rv.getLayoutManager()).scrollToPosition(currentVisiblePosition); 
currentVisiblePosition = 0; 
+1

Первое решение сработало, спасибо! – benzabill

+1

Отличное решение .. !! –

2

Пользователь вашего утилизатор вид linearlayoutmanager для получения позиции прокрутки

int position = 0; 
if (linearLayoutManager != null) { 
    scrollPosition = inearLayoutManager.findFirstVisibleItemPosition(); 
} 

и при восстановлении использовать следующего код

if (linearLayoutManager != null) { 
    cardRecyclerView.scrollToPosition(mScrollPosition); 
} 

Надеется, что это помогает вам

+0

извините, но этот ответ был первым в комментариях по моему вопросу. – DefaultXYZ

9

Многие из этих ответов, кажется, переусердствовать.

LayoutManager поддерживает onRestoreInstanceState из коробки, поэтому нет необходимости сохранять позиции прокрутки и т. Д. Встроенный метод уже сохраняет идеальные позиции пикселей.

пример фрагмент кода (проверка нулевой т.д. удалены для ясности):

private Parcelable listState; 
private RecyclerView list; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    listState=savedInstanceState.getParcelable("ListState"); 

} 

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

    outState.putParcelable("ListState", list.getLayoutManager().onSaveInstanceState()); 

} 

затем просто позвоните

list.getLayoutManager().onRestoreInstanceState(listState); 

когда данные были повторно подключить к вашему RecyclerView

+1

WoW! Простое и простое решение :) –

+0

Я думаю, что это лучшее решение! – illusionJJ

+0

Мне пришлось добавить 'Android: configChanges =" ориентацию | screenSize "' в AndroidManifest.xml. Чем выше код работал. Спасибо –

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