2017-03-17 72 views
0

当我从另一个片段回到这个片段时,我无法恢复水平RecyclerView的滚动位置。所以我有一个主要的垂直RecyclerView,其中有几个水平的RecyclerViews。我需要保存这些内部列表的位置。这里是我的片段,我在那里保存状态:无法在RecyclerView中保存状态

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

     if (outState == null){ 
      outState = new Bundle(); 
     } 
     // saves the positions in lists 
     Map<String, Parcelable> states = mainVideoAdapter.saveSubListState(); 
     Iterator it = states.entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry pair = (Map.Entry) it.next(); 
      outState.putParcelable((String) pair.getKey(), (Parcelable) pair.getValue()); 

     } 

    } 

这里就是我所说的onSaveInstanceState()(适配器)的代码:我检索片段这种状态

Map<String, Parcelable> states; 
    public Map<String, Parcelable> saveSubListState(){ 
     states = new HashMap<>(); 
     for (int i = 0; i < mainItems.size(); i++) { 
      if (!mainItems.get(i).isSliding()){ 
       String key = mainItems.get(i).getGenreEntity().getId(); 
       if (recyclerViews.get(key) != null){ 
        states.put(key, recyclerViews.get(key).getLayoutManager().onSaveInstanceState()); 
       } 
      } 
     } 

     return states; 
    } 

在这里:

Bundle outState; 
    @Override 
    public void onResume() { 
     super.onResume(); 

     if (outState != null){ 
      Map<String, Parcelable> states = mainVideoAdapter.getStates(); 
      if (states != null && !states.isEmpty()){ 
       Iterator it = states.entrySet().iterator(); 
       while (it.hasNext()) { 
        Map.Entry pair = (Map.Entry) it.next(); 
        Parcelable savedRecyclerLayoutState = outState.getParcelable((String) pair.getKey()); 
        mainVideoAdapter.getRecyclerViews().get(pair.getKey()) 
          .getLayoutManager().onRestoreInstanceState(savedRecyclerLayoutState); 
        it.remove(); // avoids a ConcurrentModificationException 
       } 
      } 
     }  

    } 

我做错了什么?

回答

3

我认为你应该这样做,在你的Recyclerview被放置的片段。

View mView; // declare it globally 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if(mView == null){ // it will not reload Recyclerview it will set first time view which is loaded. 
      mView = inflater.inflate(R.layout.yourview, null); 
     } 
     return rootView; 
    } 

onCreateView()片段每次当导航回该片段呼叫。所以首次初始化View,这个Recyclerview状态将保持原样。

希望这有助于

+0

对不起,它并没有帮助 – alla

+0

你删除其他的代码?从'onResume()'和'OnPause()'?你在哪里保存更改内容?需要评论或删除该代码。 –

+0

是的。我实际上尝试了两种变体:用我的代码,没有它。 – alla