2017-03-16 2 views
0

Ich weiß, dass ähnliche Fragen bereits gestellt wurden, aber es scheint keine endgültige Antwort auf die Aktualisierung einer Listview zu geben.Listview von Aysntask durch adapter.add nicht funktioniert

Ich versuche, eine Listview in der Benutzeroberfläche über eine asynctask mit Arrayadapter zu aktualisieren.

Ich versuche, die Werte zu dem Adapter hinzuzufügen, während kein Fehler angegeben wird, scheint es nicht zu funktionieren, da die Listenansicht leer bleibt.

Wenn ich das Array direkt in den Adapter eingeben, funktioniert es. Aber ich möchte dies durch eine asynctask für zukünftige Entwicklung tun.

Nicht sicher, ob es durch die Fortschrittsaktualisierung wie unten oder in der PostExecute getan werden sollte.

Hier ist der Code.

public class MainActivity extends AppCompatActivity { 

    ListView myList; 
    ArrayAdapter adapter; 
    private String[] names = {"Test1","Test2","Test3","Test4","Test5"}; 


    //MAIN METHOD TO START PROGRAM 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     myList = (ListView) findViewById(R.id.listView); 
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>()); 
     myList.setAdapter(adapter); 


     new MyTask().execute(); 
    } 



    class MyTask extends AsyncTask<Void, String, String> { 

     ArrayAdapter<String> adapter; 


     @Override 
     protected void onPreExecute() { 
      System.out.println("PreExecute Method Triggered"); 
      adapter = (ArrayAdapter<String>)myList.getAdapter(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 

      for (String Name : names) 
      { 
       publishProgress(Name);      
      }    
      return "Values added"; 
     } 


     @Override 
     protected void onProgressUpdate(String... values) { 
      adapter.add(values[0]); 
      System.out.println("OnProgress Method Triggered = " + values[0]); 
     } 


     @Override 
     protected void onPostExecute(String result) { 
      System.out.println("PostExecute Method Triggered" + result); 
     } 
    } 

} 

Hier ist mein Listview in meinem acivity_main.xml

<ListView 
     android:id="@+id/listView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@drawable/gradient_bg" /> 

Antwort

0

benötigen Sie den Adapter informieren, um die ListView zu aktualisieren, da die zugrunde liegenden Daten geändert haben. Sie müssen dazu notifydatasetchanged anrufen. Siehe documentation für ArrayAdapter.

adapter.notifydatasetchanged() nach add in onProgressUpdate() oder in onPostExecute() hinzufügen.

+0

Danke. Mir fehlte der letzte Befehl, aber ich fand auch eine andere Zeile, die meinen Code durcheinander brachte. Ich hatte eine this.recreate(); innerhalb der gleichen Methode, um den Bildschirm zu aktualisieren. Das löschte den Listview genau nach dem Auffüllen. – EtienneSW

Verwandte Themen