1

最適化とパフォーマンスに関してフラグメントトランザクションのより良いアプローチはどれですか?フラグメントトランザクションのためのより良いアプローチ

ParentFragment-

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.container, ChildFragment.newInstance(arrayList)); 
    ft.commit(); 

ChildFragment-

public static ChildFragment newInstance(ArrayList<PlanModel> bPlanModels) { 
     ChildFragment fragment = new ChildFragment(); 
     Bundle bundlearrayList = new Bundle(); 
     bundlearrayList.putSerializable(AppConstant.ARRAYlIST, bPlanModels); 
     fragment.setArguments(bundlearrayList); 
     return fragment; 
    } 

ParentFragment-

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.container, ChildFragment.newInstance(arrayList)); 
    ft.commit(); 

ChildFragment-

private ArrayList<BrowsePlanModel> bPlanModels; 

public ChildFragment(ArrayList<PlanModel> bPlanModels) 
{ 
this.bPlanModels=bPlanModels 
} 
public static ChildFragment newInstance(ArrayList<PlanModel> bPlanModels) 
{ 
     ChildFragment fragment = new ChildFragment(bPlanModels); 

     return fragment; 
} 

3.

ParentFragment-

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction();. 
    ChildFragment fragment = new ChildFragment(); 
    Bundle bundlearrayList = new Bundle(); 
    bundlearrayList.putSerializable(AppConstant.ARRAYlIST, bPlanModels); 
    fragment.setArguments(bundlearrayList); 
    ft.replace(R.id.container, fragment); 
    ft.commit(); 

答えて

2

すべてのアプローチが間違っています。 最初の配列では、シリアライザブルとしてバンドルされて格納されているため、パフォーマンスが低下します。それをパーセル可能な配列に変更する必要があります。

bundlearrayList.putParcelableArrayList(AppConstant.ARRAYlIST, bPlanModels); 

この場合、リストオブジェクトはParcelableインターフェイスを実装する必要があります。もちろん

あなたも、シリアライズ可能なのではなく、parcelable配列を入れて、より読みやすくするためにビルダーを使用している場合は最初のものは、右のようになります。デフォルトコンストラクタが中に残される必要があるため

getSupportFragmentManager().beginTransaction() 
    .replace(R.id.container, ChildFragment.newInstance(arrayList)) 
    .commit(); 

2つ目は、完全に間違っています断片化されていないと、システムはその状態を復元することができず、試行時に例外をスローします。また、それを追加しても、最初の引数は入力バンドルには存在しないので復元されないため、間違っています。

バングルを塗りつぶすことが内部の実現であるため、最初の部分にバンドルを埋めようとすると、第3のバグはカプセル化されていません。

ところで、実際のプロジェクトでは、トランザクションの責任を最初のフラグメントから特定のTransactionManagerクラスにカプセル化することを好みます。このアプローチはdagger2のようなフレームワークで簡単に維持されます

+0

私は3番目のものを更新しました。それをチェックして、最初のものと比べて悪い理由を詳細にお知らせください。 –

+0

@AndroidLearner 3番目のケースではバンドルします。変更が必要ありません) – Beloo

+0

トランザクションが完了する前の最初のケースでは、newInstanceメソッドを呼び出しています。ここでは、bundle.soを初期化しています。この場合、bundleも先頭に入りますか? –

関連する問題