Навигация вверх с помощью 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 (переполнение стека)

Хранение подсписка уже загруженных элементов будет слишком тяжелым для вашего приложения...

Другие вопросы по тегам