recyclerView 如何在没有任何额外编码的情况下保持其滚动位置
how is the recyclerView maintains its scroll position without any extra coding
创建了一个简单的 activity,它有一个 recyclerView 并显示数据列表。当打开设置的'don't keep activity alive'
并设置'Background process limit'
为'No background process'
。预计活动将在后台被 os 终止。
当最小化应用程序并重新打开它时,看到 activity 的 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);
}
但是 ui 仍然显示上次滚动的 pos 中的项目(正确恢复)。
有谁知道之前的position是怎么转移到新的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>
activity:
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);
}
}
这是 Android 为许多视图执行的默认状态保存的一部分。要启用此功能,您唯一需要做的就是为视图提供一个 android:id
属性(如果您拿走该 id,您会注意到它不再保存滚动位置)。例如,同样如此。输入的文本 EditText
.
创建了一个简单的 activity,它有一个 recyclerView 并显示数据列表。当打开设置的'don't keep activity alive'
并设置'Background process limit'
为'No background process'
。预计活动将在后台被 os 终止。
当最小化应用程序并重新打开它时,看到 activity 的 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);
}
但是 ui 仍然显示上次滚动的 pos 中的项目(正确恢复)。
有谁知道之前的position是怎么转移到新的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>
activity:
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);
}
}
这是 Android 为许多视图执行的默认状态保存的一部分。要启用此功能,您唯一需要做的就是为视图提供一个 android:id
属性(如果您拿走该 id,您会注意到它不再保存滚动位置)。例如,同样如此。输入的文本 EditText
.