Fragment中的ListView可以保存数据,但不会在方向更改时填充

时间:2014-08-06 05:39:21

标签: listview android-fragments

我有一个主要活动,它使用由片段填充的3个标签。其中一个片段有一个由和ArrayList填充的列表视图。视图通过“添加”按钮成功添加新项目,并按原样更新。当我旋转到不同的方向(纵向到横向或横向到纵向 - 无关紧要)时,列表视图不会重新浮动。

使用onSaveInstanceState(...)成功保存ArrayList中的数据,并成功地重新填充到onActivityCreated(...)方法中的ArrayList中(我也在onCreateView(...)方法中尝试了它)完全相同的结果)。但是,数据不会重新填充到ListView中。

此外,在第一个方向更改时重新填充ArrayList时,所有数据在下一个方向更改时都会丢失。

现在试图解决这个问题一段时间没有运气。我已经发布了下面片段的代码。任何帮助将不胜感激。

public class FragZones extends Fragment {

public static final String SAVED_ZONE_LIST = "homecontrol.zones";
private static final int REQ_ZONE_NAME = 0;

ArrayList<String> listZones;
ImageButton ibtnAddZone, ibtnRemoveZone;
ArrayAdapter<String> adapter;
ListView lvZones;
String selectedZone;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedState) {
    //setRetainInstance(true);
    View view = inflater.inflate(R.layout.frag_zones, container, false);

    ibtnAddZone = (ImageButton) view.findViewById(R.id.ibtnAdd);
    ibtnRemoveZone = (ImageButton) view.findViewById(R.id.ibtnRemove);
    lvZones = (ListView) view.findViewById(R.id.lvZones);
    listZones = new ArrayList<String>();

    // set ListView adapter
    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, listZones);
    lvZones.setAdapter(adapter);

    /*
     *  On click listeners
     */
    lvZones.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View v, int position,
                long mLong) {
            selectedZone = (String) lvZones.getItemAtPosition(position);
        }

    });;

    ibtnAddZone.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            addZone();
        }
    });

    ibtnRemoveZone.setOnClickListener(new View.OnClickListener() {  
        @Override
        public void onClick(View v) {
            if (selectedZone != null)
                removeZone(selectedZone);
        }
    });
    return view;
}



@Override
public void onActivityCreated(Bundle savedState) {
    super.onActivityCreated(savedState);
    if ( savedState != null){
        String names = "";  // for debugging
        @SuppressWarnings("unchecked")
        ArrayList<String> listZones = (ArrayList<String>) savedState.getSerializable("zones");
        for (int i = 0; i < listZones.size(); i++){
            names += listZones.get(i).toString()+ "\n";
        }
        Toast.makeText(getActivity(),names, Toast.LENGTH_SHORT).show();  // for debugging
        /*adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, listZones);
        lvZones.setAdapter(adapter);*/
        adapter.notifyDataSetChanged();
    }
}


@Override
public void onSaveInstanceState(Bundle outState) {

    outState.putSerializable("zones", listZones);
}

1 个答案:

答案 0 :(得分:0)

所以我找到了一种方法来完成这项工作。首先,我将onActivityCreated(...)中的代码放回onCreateView(...)中。基本上,我刚刚创建了一个临时ArrayList,用于将值保存在savedState Bundle中,清除listZones(并通知适配器 - 否则它不起作用),然后将临时数组的值复制到listZones数组,并在之后通知适配器每次添加(否则不起作用)。然后我清除了tempList以释放内存?

if ( savedState != null){
    ArrayList<String> tempList = (ArrayList<String>) savedState.getSerializeable("zones"));
    listZones.clear();
    adapter.notifyDataSetChanged();
    for (int i = 0; i < tempList.size(); i++){
        listZones.add(tempList.get(i));
        adapter.notifyDataSetChanged();
    }
    tempList.clear();
} 

我已经为每个Zone创建了一个类,并使它成为Parcelable以使一切变得更加平滑,但就保存和ArrayList来说,这很有效。