2

フラグメント内にカスタム リストがあります。次に、フラグメントを別のリストに置き換えます。

以前のリスト (フラグメントの置換の結果として破棄された) に戻ったときに、リストの最後の状態 (チェックされたアイテムやスピナーで選択されたアイテムなど) を復元したい。onSaveInstanteStateリストの最後の状態を使用してそこに入れ、onActivityCreatedバンドルから取得する必要があることを私は知っています。問題は、リストが複雑で、Bean クラスと CustomAdapter があることです。以下のコードを使用できると思います。

(私は使用しましprivate List<NameBean> items;た):

@Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        StringBuffer sb = new StringBuffer();
        // Retrive Data from list
        for (NameBean bean : items) {
            /* bean gets the orders values from NamesAdapters and MainActivity.
        But the orders like "isSelected" (value of a boolean which is defined here in upper block) or
        "IsSelected" and "SetSelected" which gets and sets the value of the boolean "selected" in 
        NameBean.java (Setters and getters) in conditional (boolean) format (true or false).
        We can access them in MainActivity and NamesAdapter   */
            if (bean.isSelected()) {
                sb.append(bean.getName() + ": " + bean.getSpinnerItem());
                sb.append("\n");
            }
        }
        showAlertView(sb.toString().trim());
    }

私の NameBean クラスは次のとおりです。

public class NameBean {

private String name;
private String spinnerItem;
private SpinnerAdapter spinnerAdapter;
private boolean selected;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public boolean isSelected() {
    return selected;
}

public void setSelected(boolean selected) {
    this.selected = selected;
}

public SpinnerAdapter getSpinnerAdapter() {
    return spinnerAdapter;
}

public void setSpinnerAdapter(SpinnerAdapter spinnerAdapter) {
    this.spinnerAdapter = spinnerAdapter;
}

public String getSpinnerItem() {
    return spinnerItem;
}

public void setSpinnerItem(String spinnerItem) {
    this.spinnerItem = spinnerItem;
}

}

4

1 に答える 1

2

答えは簡単でトリッキーだと思いました!

フラグメントを置き換える前に複雑なリストを保存する理由は (私の場合) ありません。フラグメントを動的に定義し、フラグメントにタグを設定しました。次に、それらを置き換える代わりに、一方を非表示にして他方を表示します。このコードはメイン アクティビティにあります。

FragmentManager fm = getFragmentManager();
    WebViewerFragment firstfragment = new WebViewerFragment();
    WebViewerFragment_II secondfragment = new WebViewerFragment_II();
    fm.beginTransaction()
    .add(R.id.detail_fragment, firstfragment, "1")
    .add(R.id.detail_fragment, secondfragment, "2")
    .hide(secondfragment)
    .addToBackStack(null)
    .commit();

(これが動的にフラグメントにタグを追加する唯一の方法であるため、2 番目のフラグメントを追加することを余儀なくされました!フラグメントを変更するためのアクションに応答するには、このタグが必要です)。次に、可視性を切り替えてフラグメント コンテンツを変更します。

FragmentManager fms = getFragmentManager();
        Fragment firstFragment = getFragmentManager().findFragmentByTag("1");
        Fragment secondFragment = getFragmentManager().findFragmentByTag("2");
        fms.beginTransaction()
        .hide(secondFragment)
        .show(firstFragment)
        .addToBackStack(null)
        .commit();

この問題を抱えている人を助けることができれば幸いです。これは、いつでも必要に応じて、replace または remove (複数のフラグメント) などのトランザクション操作によってそれらを処理でき (デフォルト ビューを取得する場合)、トランザクション.commit();の最後に追加すると、すべての変更に対して同時にアクションが実行されることは明らかです。

于 2012-12-03T12:57:51.850 に答える