Expandable Listview nach asynctask füllen

  • Antworten:2
  • Bentwortet
Hauke Schrills
  • Forum-Beiträge: 67

20.02.2015, 21:03:14 via Website

Hallo Leute

Ich habe ein expandable Listview und möchte das nachdem ein Asynctask ausgeführt wurde mit den erworbenen Daten füllen.

mein Code sieht wie folgt aus:

public class Termine extends Activity {

ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
HashMap<String, List<String>> listDataChild;

private List<Termin> T_Termin = new ArrayList<Termin>();
String feedUrl="http://.......svc.php";
int strDate=0;

DbTask loader;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_termine);
    listDataHeader = new ArrayList<String>();
    listDataChild = new HashMap<String, List<String>>();

    // get the listview
    expListView = (ExpandableListView) findViewById(R.id.expandableListView1);


    loader= new DbTask();
    loader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

DBTask wird asynchron ausgeführt
Darum wollte ich das View in

    protected void onPostExecute(Void result) {

        Log.i("Post","vor");

        Runnable addMessage = new Runnable() {
            @Override
            public void run() {
                Termin TerminItem;
                for(int i=0;i<5;i++)
                {
                    TerminItem= T_Termin.get(i);
                    Log.i(String.valueOf(i),TerminItem.getDescription());
                    Log.i(String.valueOf(i),"i");

                    prepareListData();
                }
            }
        };

        new Thread(addMessage).start();

        super.onPostExecute(result);
    }

ausführen

   private void prepareListData() {


    // Adding child data
    listDataHeader.add("Januar");
    listDataHeader.add("Februar");
    listDataHeader.add("Maerz");

    // Adding child data
    List<String> Januar = new ArrayList<String>();
    Januar.add("HALLO");

    List<String> Februar = new ArrayList<String>();
    Februar.add("The Conjuring");


    List<String> Maerz = new ArrayList<String>();
    Maerz.add("2 Guns");


    listDataChild.put(listDataHeader.get(0), Januar); // Header, Child data
    listDataChild.put(listDataHeader.get(1), Februar);
    listDataChild.put(listDataHeader.get(2), Maerz);

    listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);

    // setting list adapter
    expListView.setAdapter(listAdapter);

}

Dabei erhalte ich folgende Fehlermeldeung, dass ich den View nur
im ursprünglichen Task geändert werden kann.

E/AndroidRuntime(7871): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5594)

Wie kann ich das besser anstellen ?

Danke und Gruß
Hauke

— geändert am 20.02.2015, 21:07:04

Antworten
Hauke Schrills
  • Forum-Beiträge: 67

20.02.2015, 21:26:19 via Website

Sorry
habs gerade noch mal durchgelesen
es muss natürlich so heißen:

runOnUiThread(new Runnable() {
             @Override
             public void run() {

Gruß
Hauke

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.02.2015, 21:47:53 via Website

Only the original thread that created a view hierarchy can touch its views.

Das sagt doch schon alles aus.
Du kannst aus einem anderen Thread keine Views ändern.
Das muss aus dem MainThread geschehen.
Entweder du lässt das mit dem Run in new Thread weg oder nummst Run in UI Thread.
Oder nochbesser du benutzt ein Callback und machst das ganze in deiner Activity.

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten