Kann nicht android listview in onPostExecute aktualisieren

Ich habe das in meiner onCreate Methode:

 String[] myStringArray = {"a","b","c","a","b","c","a","b","c","a","b","c","a","b","c","a","b","c"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_top_jokes); new loadJson().execute(); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray); ListView listView = (ListView) findViewById(R.id.topJokesList); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // When clicked, show a toast with the TextView text Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); } }); } 

Der obige Code füllt eine listView mit dem Inhalt von myStringArray , denn jetzt ist alles in Ordnung. Das Problem kommt, wenn ich new loadJson().execute(); Es läuft gut und hier ist die Methode der Code:

 public class loadJson extends AsyncTask<Void, Integer, String>{ @Override protected String doInBackground(Void... params) { URL u; StringBuffer buffer = new StringBuffer(); try { u = new URL("https://website.com/content/showContent.php"); URLConnection conn = u.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) buffer.append(inputLine); in.close(); }catch(Exception e){ e.printStackTrace(); } return buffer.toString(); } protected void onPostExecute(String buffer) { JSONArray jsonArray = new JSONArray(); try { jsonArray = new JSONArray(buffer); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("JSONarray: " + jsonArray); String[] newArray = null; for (int i = 0; i < jsonArray.length(); i++) { try { newArray[i] = jsonArray.getJSONObject(i).toString(); } catch (JSONException e) { e.printStackTrace(); } } myStringArray = newArray; } } 

Wie Sie sehen können, aktualisiere ich den Hardcoded-Inhalt von myStringArray mit den neuen Werten, die in newArray abgerufen wurden. Jetzt kann ich den neuen Inhalt nicht sehen. Ich weiß, dass es da ist, aber wie kann ich die aktuelle Aktivität erzählen: "Hey, ich habe dein Array aktualisiert, bitte zeig es!" ?

Ich weiß, dass mir etwas wirklich Kleines fehlt, aber als Anfänger kann ich es nicht sehen.

9 Solutions collect form web for “Kann nicht android listview in onPostExecute aktualisieren”

Sie haben die Referenz des Arrays umgestellt, was Sie tun sollten, ist, clear und addAll auf der addAll zu verwenden (übergeben Sie die Adapterinstanz auf Ihre AsyncTask, um darauf zuzugreifen).

In deinem onPostExecute kannst du folgendes versuchen:

 ListView listView = (ListView) findViewById(R.id.topJokesList); listView.getAdapter().notifyDataSetChanged(); 
 protected void onPostExecute(String buffer) { JSONArray jsonArray = new JSONArray(); try { jsonArray = new JSONArray(buffer); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("JSONarray: " + jsonArray); String[] newArray = null; for (int i = 0; i < jsonArray.length(); i++) { try { newArray[i] = jsonArray.getJSONObject(i).toString(); } catch (JSONException e) { e.printStackTrace(); } } myStringArray = newArray; 

}

In deinem vorangehenden Code benutest du irgendeinen Code von Code, der eigentlich in Worker Thread (doInBackgroud ()) Methode so schneiden Sie diesen Code und fügen Sie in doInBackgound-Methode. Dann behalte diesen Code in onPostExecute-Methode und deklariere listview und arrayadapter vor oncreate-Methode, dh Global

 listView = (ListView) findViewById(R.id.topJokesList); listView.getAdapter().notifyDataSetChanged(); 

Ich hoffe das wird dir helfen …

Sie können von Array zu ArrayList wechseln und adapter.notifyDataSetChanged aufrufen, nachdem Sie den Array-Listeninhalt aktualisiert haben (aber keine neue ArrayList-Instanz erstellen), muss Update auf demselben Bezug stehen, wie es ArrayAdapter bereitgestellt hat).

Oder wiederholen Sie den folgenden Code (von onCreate) in Ihrem AsyncTask.onPostExecute:

 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, newArray); listView.setAdapter(adapter); 

Ich habe die Antwort auf diese Frage gefunden, weil ich selbst die Antwort gesucht habe. Es gibt ein paar enge Antworten hier, aber sie lassen Stücke, die Sie nie auf die Antwort bekommen werden.

Zuerst fügen Sie Ihrer AsyncTask-Klasse zwei Member-Variablen hinzu:

 private ListView listView; private Activity activity; 

Als nächstes fügen Sie einen Konstruktor zu Ihnen AsyncTask Klasse, die eine Aktivität nimmt:

  public loadJson(Activity activity) { this.activity = activity; } 

Nun, wenn du neu deine AsyncTask-Klasse und call execute () hast, fügst du den Verweis auf die Aktivität hinzu, die sie aufgerufen hat ( dieser Wert wurde bei der Erstellung Ihrer AsyncTask-Klasse übergeben).

 new loadJson(this).execute(param); 

Schließlich, zurück in deinem AsyncTask schreibst du den Code für dein postExecute (), das wie folgt aussieht:

 protected void onPostExecute(String output) { listView = (ListView) activity.findViewById(R.id.targetListView); ArrayAdapter<String> adapter = (ArrayAdapter<String>)listView.getAdapter(); adapter.add(output); adapter.notifyDataSetChanged(); } 

Du musst einen Verweis auf deine Aktivität haben, damit du die findViewById anrufen kannst. Beachten Sie, dass die targetListView die ID Ihres ListView ist, die auf Ihrer ursprünglichen Aktivität liegt.

Wir haben diese Aktivität in den Konstruktor von AsyncTask geschickt, so dass es verfügbar ist. Jetzt können Sie den Adapter und fügen Sie Ihren Wert zu Ihnen und rufen Sie notifyDataSetChanged () so wird es auf Ihrer Benutzeroberfläche aktualisieren.

Ich benutze diesen Code in meiner Lösung und es funktioniert super.

Sie müssen: A. Verwenden Sie die Strings.xml-Datei B. Ändern Sie den String von einem zum anderen – zB

 <string name="example1">hi</string> <string name="example2">hello</string> 

In der Datei strings.xml und dann in der Hauptklasse:

 label.setText("@string/example2"); 

Wenn die Zeichenfolge Beispiel 1 ist. Wenn das nicht hilft, weiß ich nicht was wird …

Sie können Ihren Adapter in den Asynctask-Konstruktor hinzufügen:

In deiner Tätigkeit:

  LoadJson lj = new Json(adapter); lj.execute(); 

Sie können in LoadJson erklären:

 private ArrayAdapter<String> mAdapter; 

Im Konstruktor bekommst du den Adapter von der Aktivität:

 public LoadJson(ArrayAdapter<String> adapter){ mAdapter = adapter; } 

So können Sie in Ihrem postExecute den Adapter aktualisieren. Ich hoffe es hilft!

Setzen Sie die Klasse "loadJson" als Unterklasse Ihrer ListActivity-Klasse (oder Aktivität oder welche Aktivität Sie verwenden)

Füge einfach eine Referenz von Adapter in deine AsyncTask ein:

 public class loadJson extends AsyncTask<Void, Integer, String>{ ArrayAdapter<String> adapter; public loadJson(ArrayAdapter<String> adapter) { this.adapter = adapter; } //... protected void onPostExecute(String buffer) { if (this.adapter != null) { // update adapter } } } 

Dann

 new loadJson(adapter).execute(); 

Und jetzt kannst du deinen Adapter in onPostExecute

  • Beste Weg, um Android Gradle Abhängigkeiten zu verwalten
  • Wie Anti-Virus-Software programmgesteuert scannen Code von installierten Android-Apps (ohne Root-Privilegien)?
  • Android "gps erfordert ACCESS_FINE_LOCATION" Fehler, obwohl meine Manifest-Datei enthält diese
  • Bereitstellung von Android-Anwendungen. Fehlende 'installReleaseDebug' Aufgabe für gradle
  • Falsch positiver Flusenberechtigungsfehler auch nach der Erlaubnis zur Erlaubnis zur Laufzeit
  • GCM Push-Nachrichten auf dem Server gehalten, bis eine neue kommt
  • StateListDrawable zum Umschalten von Farbfiltern
  • HttpClient Stände für längere Zeit, auch mit Timeout-Parameter gesetzt
  • Wie benutzt man FirebaseInstanceId.getInstance ()? DeleteInstanceId ()?
  • Zeigen Sie Informationen auf, welche Taste gedrückt wurde
  • Hinzufügen von Support-Bibliothek zu Android-Studio-Projekt
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.