0

我在刷新列表视图中的数据时遇到问题。我从服务器获取列表中的数据,当我想刷新数据时,我需要转到服务器并接收新数据。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);                        
        }       
    });
4

3 回答 3

0

当您旋转设备时,活动实际上开始停止并开始,并且您的初始请求将再次发出。

您应该将您的请求代码放入一个方法中并自己调用它

于 2012-11-30T15:36:26.477 回答
0

与 Rawkode 提到的类似,实际上执行从服务器检索数据的工作的代码似乎不是可重用的(因为它存在于onCreate(). 看看这张图:http: //developer.android.com/images/activity_lifecycle.png。如您所见,该onCreate()方法只执行一次,除非重新创建 Activity(即旋转屏幕)。

此外,从给定的代码来看,似乎也没有刷新方法的证据。用户将如何刷新数据?考虑重构您的代码,以便在您可以稍后调用的方法(即refreshData())中完成工作,然后找出您希望用户刷新的方法。例如,您可以使用带有刷新 ActionItem 的 ActionBar、菜单选项甚至按钮。

于 2012-11-30T15:49:08.507 回答
0

使用 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("");

试试看!..希望这有帮助..

于 2012-11-30T15:44:48.830 回答