2017-03-17 46 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