0

ここの初心者。コードを投稿する前に、簡単な説明を。

  1. http経由でデータをロードし、SQL Liteデータベースに保存して表示する小さなアプリがあります.1つは名前付き、もう1つは曜日付きの2つのスピナーを設定します。名前と曜日の組み合わせを選択すると、その人がその日に何をしているかを示すテキストが表示されます。組み合わせが選択されている場合は、SharedPreferences を使用して保存されます。これはすべて正常に機能します。

  2. サーバーから新しいデータを取得するために、「更新」ボタンの下に非同期タスクを設定しました。これはなくなり、データを取得し、データベースを再作成し、表示を更新します。名前スピナーが何らかの形で再初期化されているかのように、常に最初のエントリにリセットされることを除いて、これのほとんどは正常に機能します。

  3. これをデバッグすると、非同期タスクが Looper クラスで終了するまで、すべてがうまく機能します。これが何をするのかはわかりませんが、クリーンアップのように見え、そこのどこかでスピナーがリセットされます。

  4. 以下は、削除された非同期タスクです。

何か案は?

private class GetDataAsyncTask extends AsyncTask<String, Void, String> {
    String response = "";
ProgressBar pb=(ProgressBar)findViewById(R.id.progressBar2);
Spinner spinner1 = (Spinner) findViewById( R.id.spinner1 );

    @Override
    protected void onPreExecute() {
        pb.setVisibility(View.VISIBLE);
        pb.setMax(100);
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(String... mystring) {
        //get database
       response=get_data_from_PMS();
       Load_Arrays_with_stored_data();
       return response;
    }
    @Override
    protected void onPostExecute(String result) {
        // display new updated consultant list
        ArrayAdapter adapter_cons = new ArrayAdapter(whereisthatconsultantActivity.this,android.R.layout.simple_spinner_item, cons_spinner);
        spinner1.setAdapter(adapter_cons);
        adapter_cons.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //
       spinner1.setSelection(GetDisplayVal("selconspos"));

    //
    textView2.setText(display_stored_data());
    //
    pb.setVisibility(View.INVISIBLE);

    }
}
4

1 に答える 1

1

これでうまくいくかどうかはわかりませんが、 onPostExecute が実行されるたびに新しいアダプターを作成するという事実に関係している可能性があります。次の行を onPostExecute から別の場所 (おそらく onCreate) に削除できますか?

ArrayAdapter adapter_cons = new ArrayAdapter(whereisthatconsultantActivity.this,android.R.layout.simple_spinner_item, cons_spinner);
spinner1.setAdapter(adapter_cons);
adapter_cons.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

次に、 onPostExecute を次のように変更します。

@Override
protected void onPostExecute(String result) {

   adapter_cons.notifyDataSetChanged();
   spinner1.setSelection(GetDisplayVal("selconspos"));
   textView2.setText(display_stored_data());
   pb.setVisibility(View.INVISIBLE);

}

コードから判断するのに苦労しているため、doInBackground() でアダプターに新しいデータを割り当てていると仮定して、アダプターを更新する必要があります。アダプタのデータを更新するたびに、notifyDataSetChanged() を呼び出してアダプタを更新する必要があります。

それが役立つことを願っています!

于 2012-04-09T02:41:55.367 に答える