如何在同一活动中的2个片段之间保存和恢复recyclerview的位置?

问题描述:

我已经实现了一些由单个Activity托管的片段(它们在同一个活动中)。在其中一个片段中(比如片段A),我有一个垂直回收站视图。如何在同一活动中的2个片段之间保存和恢复recyclerview的位置?

当我想从片段A导航到其他片段时(出现在同一个活动中),问题就出现了。假设我点击了列表的中间成员,然后导航到下一个片段。当我想回到第一个片段(片段A)时,它首先膨胀了列表。似乎它失去了它的位置,但是,使用onSaveInstanceState()onCreateView(),我尝试在每次退出或输入片段时存储和恢复所选项目的位置。

我认为这个问题可能源于片段的生命周期,它们都在一个单独的活动中。作为this answer,提及:

在片段中,它们的所有生命周期回调都直接与其父Activity相关联。因此onSaveInstanceState在其父Activity被onSaveInstanceState调用时在Fragment上被调用。

这就是为什么我强调“单一”活动。我们如何处理这种情况?

我已经调试了我的程序,并且onSaveInstanceStateonCreateView甚至在它们应该被调用时都没有调用。下面是我尝试代码:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState!=null){ 
     selectedItem = savedInstanceState.getInt(BUNDLE_KEY_SELECTED_ITEM); 
    } 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) {      
    if (savedInstanceState != null){ 
     selectedItem = savedInstanceState.getInt(BUNDLE_KEY_SELECTED_ITEM); 
    } 
    myRecyclerView = (RecyclerView) v.findViewById(R.id.rv_mine); 

    // mData is a an ArrayList 
    myAdapter = new MyAdapter(mData, getContext(), this.selectedItem); 
    myLayoutManager = new LinearLayoutManager(getActivity()); 
    myRecyclerView.setLayoutManager(myLayoutManager); 

    myRecyclerView.setAdapter(myAdapter); 

    return v; 
} 


@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(BUNDLE_KEY_SELECTED_ITEM,selectedItem); 
    super.onSaveInstanceState(outState); 
} 
+0

您如何将碎片添加到您的运营商活动?你能分享这段代码片段吗? – Sanoop

那么你可以使用.add()到片段添加到您的活动比.replace(),它保留了活动中的片段的状态,如果使用替换功能,这将导致onCreateView回调再次触发。