2016-04-18 4 views
0

私はRecyclerViewFragmentの多くのアプリを持っています。毎回次のFragment、つまりAからBに移動するたびに、Aのスクロール位置と値はRecyclerViewAdapterに保存されます。Android - フラグメントのメモリを失うことなくRecyclerViewの状態とアイテムを保存する

@Override 
public void onPause() { 
    super.onPause(); 
    getArguments().putParcelable(utilities.BUNDLE_RECYCLER_LAYOUT, recyclerView.getLayoutManager().onSaveInstanceState()); 
} 

そして、それをonCreateView再開:

は私が状態onPauseなどを保存

Parcelable savedRecyclerLayoutState = getArguments().getParcelable(utilities.BUNDLE_RECYCLER_LAYOUT); 
manager.onRestoreInstanceState(savedRecyclerLayoutState); 
recyclerView.setAdapter(
recyclerView.setLayoutManager(manager); 

問題は、私はBに行くとき、Aは非常に高いにつながるメモリ内に残っている、ありますもし私がA - B - A - B - A - Bに行くなら、OOMまでのメモリ使用量。

質問は以下の通りです:

  1. 状態を間違って保存していますか?
  2. アダプターのコンテンツを保存する方法はありますか?
  3. 電球を交換するには何人のプログラマーが必要ですか?

答えて

0

RecyclerViewは自動的に状態を保存します。あなたは(多くの場合)国家と何もする必要はありません。このポストを見てください - >http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en

あなたのメモリの問題はおそらく他の理由のために存在します。フラグメントは、クラスのインスタンスとして、トランジション後にメモリ内に保持されます(通知ビューが破棄され、フラグメントが再び表示されるときに再び作成されます)。 アイテムのリストをフラグメントのクラス変数として保存する場合は、AからBへ変換するときにメモリに格納されます。

データソースからデータを取得することをお勧めしますまたはデータベース)OnCreateView方法で、私はrecyclerViewは、任意のコードを追加することなく、その状態を保存する必要があり、言ったようにonDestroyView

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.myfragmentlayout, container, false); 
} 


@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    recyclerView = (RecyclerView) view.findViewById(R.id.myrecycler); 
    recyclerView.setLayoutManager(manager); 
    myDataSource.retrieveData(new DataCallback(){ 

       public void dataRetrieved(List<Item> items){ 
        //This is working on Main Thread 
        recyclerView.setAdapter(new MyAdapter(items)); 


       } 
    }); 
} 

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    recyclerView = null; 
    //with this data is freed and GarbashCollector is able to recover memory when the system needs it 
} 

内のすべてのビュー(nullに等しく)を破壊します。しかし、それはあなたのために働いていない、あなたのコードは大丈夫です。

+0

それで、私はパーセルブルなことをやっていない状態を保存する必要がありますか?そして私はあなたの答えを読んでいる間に何かを実現しました、私はアダプタ自体の中にあるすべてのViewHolderクラスを持っています。 –

+0

はい、アンドロイド・ビューは、任意のコードなしで状態を保存する必要があります。システムは、スクリーンを回転させるときに、例えば、編集テキストの入力されたテキストを保存します。この場合、ビューは新しい方向で再作成されても破棄されますが、入力したテキストはそこに存在し、何もしませんでした。それは同じ場合です。依存関係のリサイクル - >アダプター - > ViewHoldersのチェーンが壊れていてメモリが解放されている可能性があるため、OnDestroyViewでrecyclerView = nullを実行すると、ViewHoldersがアダプターにあるとは思われません。 – jDur

+0

..........だから、それはリサイクラービューですか?したがって、アダプター項目は、アダプターも無効化しない限り、引き続き維持されますか? –

関連する問題