如何在另一个活动的背压下保留Recycler视图的滚动位置?

3 android android-recyclerview

我看到很多关于这个话题的相关问题,但没有一个能帮助我.我正在使用StaggeredGridLayout作为我的RecyclerView(显示卡片).每个CardView都会打开一个新活动,我面临的问题是,在新活动的背面按下,RecyclerView会滚动回到顶部.我希望它保留以前滚动的位置.

这就是我现在用来设置布局:

rv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
rv.setHasFixedSize(true);
Run Code Online (Sandbox Code Playgroud)

新手的任何适当的工作解决方案?

编辑:

   @Override
 protected void onResume() {
     super.onResume();
    if (listState != null) {
        rvlayout.onRestoreInstanceState(listState);
    }
      initializeData();

 }
Run Code Online (Sandbox Code Playgroud)

布局:

RecyclerView.LayoutManager rvlayout = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

和initializeData:

 public void initializeData() {

    rv.setLayoutManager(rvlayout);
    rv.setHasFixedSize(true);
    persons.clear();

    c = db.rawQuery(SELECT_SQL, null);
    c.moveToFirst();

    if (!c.moveToFirst())
    return;


    while (!c.isLast()) {
        id = c.getString(0);
        names = c.getString(1);
        age = c.getString(2);
        persons.add(new Person(id,names,age));
        c.moveToNext();
    }

    adapter = new RVAdapter(persons);
    rv.setAdapter(adapter);

}
Run Code Online (Sandbox Code Playgroud)

cap*_*wag 6

正确的方法是保存RecyclerView滚动位置的状态,并在活动之间切换时恢复它.

1.要保存它,请覆盖onSaveInstanceState()

protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);

    state.putParcelable(LIST_STATE_KEY, layoutManager.onSaveInstanceState());
}
Run Code Online (Sandbox Code Playgroud)

2.检索onRestoreInstanceState()上的数据覆盖

protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);

    Parcelable listState = state.getParcelable(LIST_STATE_KEY);
}
Run Code Online (Sandbox Code Playgroud)

3.最后在onResume()方法中更新LayoutManager

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

    if (listState != null) {
        layoutManager.onRestoreInstanceState(listState);
    }
}
Run Code Online (Sandbox Code Playgroud)