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

サーバーからの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("");

試してみてください!..これがお役に立てば幸いです。

于 2012-11-30T15:44:48.830 に答える
0

Rawkodeが述べたのと同様に、サーバーからデータを取得する作業を実際に行うコードは再利用可能ではないようです(サーバーが存在するためonCreate())。この図を見てください:http://developer.android.com/images/activity_lifecycle.png。ご覧のとおりonCreate()、アクティビティが再作成されない限り(つまり、画面を回転させない限り)、メソッドは1回だけ実行されます。

また、与えられたコードから、refreshメソッドの証拠もないようです。ユーザーはどのようにしてデータを更新できますか?後で呼び出すことができるメソッド(つまりrefreshData())で作業が行われるようにコードをリファクタリングしてから、ユーザーに更新してもらいたい方法を見つけ出すことを検討してください。たとえば、アクションバーと更新アクションアイテム、メニューオプション、またはボタンのいずれかを使用できます。

于 2012-11-30T15:49:08.507 に答える