как recyclerView поддерживает свою позицию прокрутки без дополнительного кодирования

Создал простое действие, которое имеет recyclerView и отображает список данных. При включении параметра 'don't keep activity alive' и установите 'Background process limit' на 'No background process'. Ожидайте, что активность будет убита ОС в фоновом режиме.

Когда сверните приложение и снова откройте его, вы увидите, что действие onCreate () вызывается в новом экземпляре, и он делает все снова, чтобы создать новый набор recyclerView и адаптер с новым списком данных.

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        mRecyclerView = findViewById(R.id.recyclerView);
        setSupportActionBar(toolbar);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
    }

Но пользовательский интерфейс по-прежнему показывает элемент в последней прокрученной позиции (правильно восстановлен).

Кто-нибудь знает, как предыдущая позиция передается новому экземпляру recyclerView и т. Д.?

расположение:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:titleTextColor="@android:color/white"
         />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </ScrollView>
</LinearLayout>

активность:

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private ItemAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        mRecyclerView = findViewById(R.id. recyclerView);
        setSupportActionBar(toolbar);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager); 
    }


    @Override
    protected void onResume() {
        super.onResume();

        new FetchItemASyncTask(this).execute();
        // in the asyncTask it will do setup adapter when data ready
        // mAdapter = new ItemAdapter(dataList)
        // mRecyclerView.setAdapter(mAdapter);
    }
}

person lannyf    schedule 18.10.2018    source источник


Ответы (1)


Это часть сохранения состояния по умолчанию, которое Android выполняет для многих представлений. Единственное, что вам нужно сделать, чтобы включить это, - дать представлению атрибут android:id (если вы уберете этот идентификатор, вы заметите, что он больше не сохраняет позицию прокрутки). То же самое верно, например, для текст, введенный в EditText.

person Ben P.    schedule 18.10.2018
comment
Большой! Я видел, как некоторые из них сохраняют положение прокрутки и восстанавливаются из сохраненного экземпляра состояния. - person lannyf; 18.10.2018