2017-03-17 8 views
0

別のフラグメントからこのフラグメントに戻ると、水平RecyclerViewのスクロール位置を復元できません。だから私はそれにいくつかの水平RecyclerViewsを持っている1つのメイン垂直RecyclerViewを持っています。そして、これらの内部リストの位置を保存する必要があります。ここで私は状態を保存私の断片である:ここで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

関連する問題