2

我在片段中有一个自定义列表。然后我用另一个列表替换片段。

我想当我回到我以前的列表(由于替换片段而被破坏)时恢复列表的最后状态(如选中的项目或微调器选定的项目)。我知道我必须使用onSaveInstanteState并将列表的最后一个状态放入其中,然后从onActivityCreatedbundle 中获取它们。问题是我的列表很复杂,并且有一个 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();

(我被迫添加第二个片段,因为这是向片段动态添加标签的唯一方法!我需要这个标签来响应更改片段的操作)。然后我通过切换它们的可见性来更改片段内容:

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

我希望我能帮助遇到这个问题的人,因为它几乎让我发疯了。很明显,无论何时,您都可以通过诸如替换或删除(多个片段)之类的事务操作来处理它们(用于获取默认视图),并且.commit();在事务结束时添加将同时对所有更改执行操作。

于 2012-12-03T12:57:51.850 回答