我有一个主要活动,它使用由片段填充的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);
}
答案 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来说,这很有效。