我在列表视图中刷新数据时遇到问题。 我从服务器获取列表中的数据,当我想刷新数据时,我需要转到服务器并接收新数据。 notifyDataSetChanged()没有帮助,ListView.invalidateViews没有帮助。 当我旋转设备时,列表更新。 如何以与屏幕旋转相同的方式加载列表视图?
这是创建时填充列表视图的代码。
提前感谢。
query = new ParseQuery(PET_CLASS_NAME);
petListView.addHeaderView((View)getLayoutInflater().inflate(R.layout.header_row, null));
petDetailIntent = new Intent(getApplicationContext(), PetDetailActivity.class);
selectCityIntent = new Intent(this, CitiesActivity.class);
loadingIntent = new Intent(getApplicationContext(), LoadingActivity.class);
startActivityForResult(loadingIntent, LOADING_INTENT_CODE);
/*the user see list of pets that are still missing*/
query.whereEqualTo(PET_FOUNDED, false);
selectedCity = settings.getString("cityQuery", "");
if(selectedCity != ""){
query.whereEqualTo(PET_CITY, selectedCity);
}
query.findInBackground(new FindCallback() {
@Override
public void done(List<ParseObject> list, ParseException e) {
if (e == null) { //objects retrieved well
petList.addAll(list);
//MyAdapter
adapter = new MyAdapter(
getApplicationContext(),
android.R.layout.simple_list_item_1,
R.id.tv_pet_name,
petList);
setListAdapter(adapter);
}
else{
toaster(getResources().getString(R.string.error_message_load_pets));
finish();
}
finishActivity(LOADING_INTENT_CODE);
}
});
答案 0 :(得分:0)
当你旋转设备时,活动实际上已经停止并开始,你的初始请求将会重新开始。
您应将请求代码放入方法中并自行调用
答案 1 :(得分:0)
对来自Server的loadData使用AsyncTask。它会加载它更快。
试试这个:
private class YourTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... s) {
//Here you have to make the loading / parsing tasks
//Don't call any UI actions here. For example a Toast.show() this will couse Exceptions
// UI stuff you have to make in onPostExecute method
}
@Override
protected void onPreExecute() {
// This method will called during doInBackground is in process
// Here you can for example show a ProgressDialog
}
@Override
protected void onPostExecute(Long result) {
// onPostExecute is called when doInBackground finished
**// Here you can for example fill your Listview with the content loaded in doInBackground method**
}
}
而且,如果您从服务器加载内容,则必须始终调用此AsyncTask:
new YourTask().execute("");
试一试!希望这会有所帮助..
答案 2 :(得分:0)
与Rawkode提到的类似,实际上从服务器检索数据的代码似乎不可重复使用(因为它存在于onCreate()
中)。看一下这个图:http://developer.android.com/images/activity_lifecycle.png。正如您所看到的,onCreate()
方法只执行一次,除非重新创建活动(即旋转屏幕)。
此外,从给定的代码中,似乎也没有证据表明有刷新方法。用户如何刷新数据?考虑重构您的代码,以便您可以在稍后调用的方法(即refreshData()
)中完成工作,然后找出您希望用户刷新的方式。例如,您可以使用带有刷新ActionItem的ActionBar,菜单选项甚至按钮。