12

ここに状況があります。Fragment A-> B-> C からナビゲートしたい.

Bフラグメントにはリストビューがあります。アイテムをクリックすると、詳細ビ​​ュー C Fragment が開きます。もちろん、replace メソッドを使用し、B から C へのトランザクション中に addtoBackStack(null) を追加して、バック プレスで B に戻るようにしました。

すべてうまくいきます。しかし、C から B に戻ると、ビューが更新されているため、Web サービスが再度呼び出されています。私はこれをしたくありません。リストビューでB Fragmentの状態を保持したい。

Retain Instance の投稿をいくつか受け取りましたが、あまり役に立ちませんでした。

どんな助けでも大歓迎です。

ありがとう。

4

4 に答える 4

2

onCreateView() ではなく onCreate() でアダプタを作成することで、この問題を解決しました。

これは、(私が思うに) バックスタックに追加されたフラグメントがビューを失い、ビューを再作成する必要があるためです。onCreateView() が呼び出され、ついでにアダプターを再作成します。

于 2015-12-31T15:36:29.153 に答える
0

フラグメント B を離れる直前に ListView の位置を保存できると思います。フラグメント B のonStop()でそれを行うかもしれません。戻ると、その位置を取得して ListView に復元できます。たとえば、フラグメント B のonStart()でそれを行います。位置データは Activity に保存される場合があるため、フラグメントが切り離されても失われません。

保存された位置データがバックグラウンド サービスによって更新された場合、フラグメント Bのライフサイクル ステージonStart()の前に ListView に復元しないようにする必要があります。、フレームワークはフラグメントを離れる直前にビューの状態を保存し、戻ったときにそれを復元します。したがって、フレームワークがそれを行う前に自分の位置を復元すると、フレームワークの復元データがあなたのデータを上書きします。

于 2013-12-25T14:04:20.870 に答える
0

oncreate で UI の定義を保存できます。onCreateView の場合は、レイアウトに追加するだけです。ビューステートは完璧に保存できます。

これは私のSVです:

作成中

 LayoutInflater inflater = (LayoutInflater)
            ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.pulltorefreshgridview, null);
    mPullRefreshGridView = (PullToRefreshGridView) view
            .findViewById(R.id.listcate_pullrefresh_gridview);

onCreateView のストロング テキスト

if (rootView != null) ((LinearLayout)rootView).removeAllViews();
View v = inflater.inflate(R.layout.listcate_fragment, container, false);
rootView = v;


    ((LinearLayout) v).addView(mPullRefreshGridView,
            new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.FILL_PARENT,
                    LinearLayout.LayoutParams.FILL_PARENT));
于 2013-11-08T13:29:07.783 に答える