所以,我有一个简单的应用程序,它可以追踪我一天所吸收的卡路里和脂肪,并为我总计。以纵向方式工作,但当我进入横向时,列表视图被破坏,似乎数组适配器也是空的。我对StackOverflow充满了热情并尝试了几个答案,但都没有。我的印象是,当方向改变时,活动在onCreate()中重新创建,listView将从那里重新填充
根据此SO答案覆盖onConfigurationChanged() How to handle an AsyncTask during Screen Rotation?
我对这个解决方案的理解是因为我的理解onResume无论如何都是在onCreate之后调用的,所以listview wold已经重新创建了
https://github.com/Asdamp/Xday/blob/master/src/com/asdamp/x_day/MainActivity.java
我认为oncreate有问题,所以这就是代码
private ListView foodItemsList;
private DatabaseHelper db;
private ArrayList<FoodItem> allFoods;
private FoodArrayAdapter foodsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new DatabaseHelper(this);
setContentView(R.layout.activity_list_foods);
foodItemsList=(ListView)findViewById(R.id.food_items_list);
allFoods= (ArrayList<FoodItem>) db.getTodaysFoods();
foodsAdapter = new FoodArrayAdapter( this, allFoods);
// set the footer for the list
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.food_list_footer, null, false);
foodItemsList.addFooterView(footerView);
foodItemsList.setFooterDividersEnabled(true);
//set the listview to use this adapter
foodItemsList.setAdapter(foodsAdapter);
updateTotalDailyCalories();
updateTotalDailyFat();
}
在这里不知所措,这里的任何帮助都会拯救我的但是 真正的错误是方向改变后数组列表为空.........
此代码修复了问题
protected void onResume() {
super.onResume();
// check if the listview is null
if (foodItemsList==null){
// get a refference to it and re create it
foodItemsList= (ListView) findViewById(R.id.food_items_list);
// get the data again
allFoods=(ArrayList<FoodItem>)db.getTodaysFoods();
foodsAdapter.setListData(allFoods);
foodsAdapter.notifyDataSetChanged();
}
}
我仍然不明白为什么onResume需要这样做,当onCreate已经填充了listview,并且无论如何都被调用了方向更改。有人可以开导我吗?