Навигация вверх с помощью RecycleView
Я хотел бы спросить ваше мнение о способах решения проблемы с навигацией Android Up, которую я пытаюсь решить. У меня есть действие (MainActivity) с RecycleView, показывающее прокручиваемый список элементов, извлекаемый из API. Каждый элемент имеет прослушиватель onclick, который открывает действие детализации элемента, например так:
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("item", item);
context.startActivity(intent);
DetailActivity имеет кнопку "Вверх", где пользователь может вернуться к предыдущему действию. Вот манифест для этого действия:
<activity
android:name=".DetailActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.Base"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
И вот проблема: когда я перехожу к родительскому действию, список прокрутки сбрасывается и находится вверху. Если я использую кнопку "Назад" на устройстве, список сохраняется и позиция прокрутки сохраняется, но не при нажатии кнопки "Вверх"...
Я понимаю, что для восстановления списка прокрутки мне нужно где-то сохранить список уже загруженных элементов, возможно, передать его в DetailActivity и обратно, но я не уверен, что это лучшее решение. Есть ли лучшее Более элегантное и оригинальное решение для сохранения элементов прокрутки и положения прокрутки? Я прочитал Android документацию о навигации вверх, но не смог найти ответ...
2 ответа
Если нажатие кнопки "BACK" хорошо выглядит в вашем приложении, просто перехватите событие "UP":
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// simulate the "BACK" key
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
Для моего списка это способ, которым я сохраняю индекс, и способ, которым я восстанавливаю RecyclerView по этому индексу (вверху):
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());
// ...
// restore index and position
mList.setSelectionFromTop(index, top);
credit: ian (переполнение стека)
Хранение подсписка уже загруженных элементов будет слишком тяжелым для вашего приложения...