通过从RecyclerView中的项目列表单击以转到“详细信息活动”时,保存RecylerView的位置,并在返回RecylerView时将其还原

时间:2018-10-08 08:17:15

标签: android android-recyclerview linearlayoutmanager

当我们通过使用RecyclerView中的项目列表(这些项目是从Firebase JSON中检索到的项目)使用itemclicklistener进入下一个Detail Activity时,如何保存RecylerView Activity的滚动位置,并在回到Recylerview Activity并且我正在使用时恢复位置LinearLayoutManager

请帮助我 在此先感谢

4 个答案:

答案 0 :(得分:0)

问题陈述不清楚。还是我要回答。

假设您点击列表开始新的活动。根据活动的生命周期,后台活动将保持滚动状态。当您完成新活动后,返回活动将处于相同状态。

这可能是由于以下原因造成的

  1. 您通过onResume方法重新加载数据。您应该将数据加载到 onCreateView。
  2. 您将从第二个活动开始后台活动。

答案 1 :(得分:0)

通过onPause方法在Activity上保存状态,并通过onResume()方法将其恢复 查看代码

 public class Activity extends AppCompatActivity
 {
    private final String STATE = "recycler_state";
    private RecyclerView mRecyclerView;
    private static Bundle mBundle;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);//set to whatever view id you use
        // don't forget to set your adapter
    }

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

        // save RecyclerView state

        mBundle = new Bundle();
        Parcelable listState = mRecyclerView.getLayoutManager().onSaveInstanceState();
        mBundle.putParcelable(STATE, listState);
    }

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

        // restore RecyclerView state
        if (mBundle != null) {
            Parcelable listState = mBundle.getParcelable(STATE);
            mRecyclerView.getLayoutManager().onRestoreInstanceState(listState);
        }
    }
}

答案 2 :(得分:0)

我不太清楚你的问题。我以为您当前的活动在转到下一个细节时已被销毁,因此在您返回时重新创建了活动。当您转到下一个详细信息时,请勿致电finish,而只需致电onBackPressed返回上一个活动。这将保持您的recyclerView状态和位置。

无论如何,您可以使用Shared Preferences保存位置,然后再转到下一个细节并将其放回到onResume上。

答案 3 :(得分:0)

您可以使用此技巧:

int firstItemPos = mLayoutManager.findFirstVisibleItemPosition();
View v = mLayoutManager.findViewByPosition(firstItemPos);
int offsetPixel = 0;
if(v != null) offsetPixel = v.getTop();

然后恢复位置:

mLayoutManager.scrollToPositionWithOffset(firstItemPos, offsetPixel)
您可以保存

firstItemPos和offsetPixel额外的活动包。在我的示例中,mLayoutManager使用普通的LinearLayoutManager并将其设置为我的回收视图:

mLayoutManager = new LinearLayoutManager(getActivity())