在替换片段之前保存Listview状态

时间:2012-12-03 10:03:37

标签: android android-listview android-fragments

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

我希望当我回到我之前的列表(由于替换片段而被销毁)时,恢复列表的最后一个状态(如已检查项或微调器选定项)。 我知道我必须使用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;
}

}

1 个答案:

答案 0 :(得分:2)

我发现答案简单而棘手!

在替换片段之前,没有理由(在我的情况下)保存复杂列表。 我只是动态定义了片段并将标签设置为片段。然后不是替换它们,而是隐藏一个并显示另一个。此代码位于主Activity:

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();将同时对所有更改采取措施。