2012-04-09 17 views
0

Neuling hier. Vor der Buchung Code, eine einfache Beschreibung.Async Aufgabe setzt mein Spinner

  1. Ich habe eine kleine App, die Daten von über http lädt, speichert sie in einer Datenbank SQL Lite und zeigt es - zwei Spinner Einrichtung, eines mit Namen und einem mit einem Tag der Woche. Wenn Sie eine Kombination aus Name und Wochentag auswählen, wird ein Text angezeigt, der angibt, was diese Person an diesem Tag macht. Wenn die Kombination ausgewählt ist, wird sie unter Verwendung von SharedPreferences gespeichert. All das funktioniert gut.

  2. Ich habe eine asynchrone Aufgabe unter einer "Aktualisieren" -Schaltfläche eingerichtet, um neue Daten vom Server abzurufen. Dies verschwindet und ruft die Daten ab, füllt die Datenbank erneut auf und aktualisiert die Anzeige. Das meiste funktioniert gut, außer dass der Name Spinner immer auf den ersten Eintrag zurückgesetzt wird, als ob er irgendwie neu initialisiert wird.

  3. Bei der Fehlersuche funktioniert alles gut, bis die asynchronen Aufgaben in der Looper-Klasse enden. Ich bin nicht sicher, was das tut, aber sieht aus wie etwas aufräumen, und irgendwo dort ist der Spinner zurückgesetzt.

  4. Unten ist die asynchrone Aufgabe, abgespeckt.

Irgendwelche Ideen?

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); 

    } 
} 
+0

Also, es ist ein Spinner. Was bedeutet ProgressBar, das ist rund richtig? Es zeigt keinen linearen Fortschritt, es ist nur ein Kreis, der "eine Sekunde halten" bedeutet. Wenn Sie also das Zurücksetzen sagen, was meinen Sie? Ich habe ein Programm, das ein Spinner verwendet, während es eine AsyncTask abschließt, also möchte ich nur sicherstellen, dass ich das Problem verstehe, bevor ich antworte. – Davek804

+0

@ Davek804: Nein, ein Android 'Spinner' ist im Grunde eine Dropdown-Liste. Nie herausgefunden, warum sie es "Spinner" nannten. – Squonk

+0

Gut, dass ich keine ganze Antwort rausgebracht habe und mich wie ein Idiot aussehen lasse! Hoffentlich kann jemand anderes dieses Problem lösen :) – Davek804

Antwort

1

nicht sicher, ob dies für Sie tun würde, aber es kann etwas mit der Tatsache zu tun, dass Ihr einen neuen Adapter OnPostExecute jedes Mal zu schaffen ausgeführt wird.

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); 

Dann ändern Sie Ihre OnPostExecute etwas wie folgt aus::

@Override 
protected void onPostExecute(String result) { 

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

} 

Das Update sollte Ihr Adapter vorausgesetzt, weil ich Können Sie woanders (vielleicht onCreate) die folgenden Zeilen aus dem OnPostExecute entfernen Es fällt mir schwer, aus dem Code zu ermitteln, dass Sie Ihrem Adapter im doInBackground() neue Daten zugewiesen haben. Jedes Mal, wenn Sie die Daten im Adapter aktualisieren, müssen Sie notifyDataSetChanged() aufrufen, damit der Adapter aktualisiert wird.

Hoffe, dass hilft!