AsyncTask & CustomArrayAdapter aktualisieren

  • Servus zusammen!


    Ich habe ein kleines Problem, vor dem ich früher schon einmal stand aber leider die Daten zur Lösung nicht mehr habe...


    Ich lade ein JSON File übers Internet innerhalb meiner AsyncTask Klasse. Die erhlatenen Daten möchte ich in einer ListView ausgeben. Für die ListView verwende ich einen CustomArrayAdapter.


    Mein Problem ist, dass ich die geladenen Daten nicht in die ListView bekomme.


    Das Laden des JSON und verarbeiten in eine ArrayList<String> ist alles kein Thema...nur sobald ich


    Code
    listView.setAdapter(new CustomArrayAdapter(context, R.layout.list_item, rssItems));



    den Adapter setze bekomme ich: java.lang.IllegalStateException: System services not available to Activities before onCreate()



    Nun habe ich mich schon auf die Suche gemacht und auch so einiges gefunden aber ich bekomme es einfach nicht hin...


    So wie ich das verstanden habe (war schon recht spät/früh gestern), muss der Aufbau der Listview innerhalb der der onCreate stattfinden. Allerdings benötige ich ja erst einmal die Daten vom Server...


    Meine MainActivity sieht so aus:




    Und meine AsyncTaskClass sieht so aus:



    Ich hatte auch schon versucht, der ListView erst einen leeren Adapter hinzuzufügen und dann später zu aktualisieren, aber auch das hat nichts geholfen, bzw. die App crashen lassen...vllt. habe ich da auch einen Fehler gebaut gestern k.a.


    Kann mir jemand helfen? Wäre super!


    Danke


    EDIT: Ich habe nun versucht hier den Code Highlighter richtig zu verwenden, aber irgendwas läuft da falsch!!!
    EDIT2: Lag an Chrome -> Im FF funktioniert der Highlighter...

  • +hm+
    Kannst du mir mal erklären, wer deine Codes lesen können soll?
    Ich persönlich erkenne da jedenfalls überhaupt keine relevanten Informationen drin, weil es einfach kein Stück formatiert ist.


    Allerdings weiß ich nicht, ob das jetzt an dir oder am WYSIQYG Editor liegt...


    Anyways. Deine Fehlermeldung klingt eher so als würdest du den Adapter setzen bevor die onCreate aufgerufen wurde – keine Ahnung wie man das schaffen können soll.


    Wie dem auch sei würde ich zunächst auch einen leeren ListAdapter präsentieren und diesen dann füllen, nachdem die Daten da sind.
    Dafür übergibst du dem Adapter dann deine aufbereiteten Daten und schickst ihm ein notifyDataSetChanged().
    Daraufhin aktualisiert sich das ListView einmal komplett. Einen neuen Adapter setzen geht allerdings nicht.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Ja dass man den Code nicht lesen konnte, liegt bei mir am Chrome wenn ich diesen einstelle, dann werden alle Formatierungen gelöscht....habs aber über den FF aktulaisiert wie man sieht ;)


    Das updaten des Adapters funktioniert nicht, ich bekomme da eine NullPointerException....


    In meiner MainActivity habe ich die updateAdapter Methode, diese rufe ich in meiner AsyncTaskClass in der onPostExecute auf.


    Meine updateAdapter sieht nun so aus:


    Java
    public void updateAdapter(RSSItems rssItems[]){
    		this.rssItems = rssItems;
    		
    		System.out.println(this.rssItems.length);
    		adapter.setList(this.rssItems);
    		adapter.notifyDataSetChanged();
    		
    	}


    Die Fehlermeldung:




    Was mache ich falsch....`????



    EDIT: Hier mal mein Adapter:


  • Nicht mein RSSItem ist null in der updateAdapter(), sondern mein Adapter????!!!!


    Ich geben meinen Adapter via System.out.println in der onCreate() aus und einmal in der updateAdapter und in der updateAdapter ist er null....aber warum????

  • Ich sehe nicht, wo du den Adapter deiner Instanzvariable zuweist.
    Versuch es doch via getListAdapter() in deiner Activity oder setze die Instanzvariable, wenn du den Adapter instanziierst.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Meine MainActivity wie sie im Moment aussieht:


    Also Ausgabe in der Log erhalte ich:


    04-14 16:42:27.126: I/System.out(26516): onCreate(): de.ex.rssapp.CustomArrayAdapter@41d80070
    04-14 16:42:28.271: I/System.out(26516): updateAdapter(): null


    Ich weiss nicht wie ich den adapter updaten soll, wenn er null ist....ist doch zum Haare raufen....

  • Ich würde testweise den Adapter als Parameter an die updateAdapter() Methode übergeben.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • So,


    ich hab es, so glaube ich, gelöst! Ob es die sauberste Variante ist? Ich glaube nicht, aber es ist die einzige die Funktioniert!


    In meine MainActivity in der onCreate() rufe ich meinen AsyncTask auf und übergebe dabei den context und meine ListView


    Java
    @Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		listView = (ListView) findViewById(R.id.mylist);
    		
    		AsyncRSS as = new AsyncRSS(MainActivity.this, this.listView);
    		as.execute("http://search.twitter.com/search.json?q=android");
    	}


    In der MainActivity habe ich dann noch die update() Methode, die ich von der onPostExecute in der AsyncTaskClass aufrufe und übergebe dabei einen Adapter und die ListView, die vorher in die AsyncTaskClass geschleust habe:


    Java
    public AsyncRSS(Activity activity, ListView lv){
    		super();
    		this.mActivity = activity;
    		this.mLv = lv;
    	}



    Und dann noch meine update()


    Java
    public void update(CustomArrayAdapter adapter, ListView lv){
    		System.out.println(adapter);
    		this.adapter = adapter;
    		this.listView = lv;
    		this.listView.setAdapter(this.adapter);
    	}


    So funktioniert es erst einmal...wie gesagt, ich hatte das Problem vor ca. einem Jahr schon einmal, habe aber damals auf einem Mac gearbeitet den ich verkauft habe und natürlich weiss ich nicht mehr, wo ich die ganzen Projekte von damals gesichert habe...die Lösung von damals war deutlich sauberer....


    Wer was zum meckern hat zu dieser Lösung, immer her damit...denn das geht bestimmt noch sauberer....


    Danke!


    EDIT:


    Was natürlich total uncool ist -> will ich bei einem Tap auf einem ListItem zb. an den Title kommen, so muss ich folgendermaßen vorgehen in der update()


    Java
    this.listView.setOnItemClickListener(new OnItemClickListener() {
    
    
    			@Override
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
    					long arg3) {
    				System.out.println(MainActivity.this.adapter.getItem(arg2).title);
    			}
        	});


    Also wenn jemand die RICHTIGE Lösung kennt, bitte posten!!!


    EDIT2:


    Ich dreh heute noch einmal am Kabel...


    Weiss nicht genau wie ich es beschreiben soll, aber alles was nun in der Update passiert, scheint irgendwie über die AsyncTask abgewickelt zu werden....


    Natürlich will ich auch eine neue Activity aufrufen mit den Daten des geklickten Items:



    Da bekomme ich eine NullPointerException auf MainActivity.this.getApplicationContext()...hab auch schon einiges anderes ausprobiert, keine abhilfe...verdammt.

  • Es empfiehlt sich eigentlich, dass man die Daten einerseits dem Adapter und andererseits der Activity zur Verfügung stellt.
    Dann kann die Activity losgelöst vom Adapter an ihre Daten kommen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • So,


    nun sollte ich es haben...manchmal sieht man den Wald vor lauter Bäumen nicht...


    Meine onCreate()



    wenn ich einen String erhalte, kann ich diesen direkt in der setAdapter und einer weiteren function weiterverarbeiten...


    Funktioniert alles wunderbar und so leicht :D

  • Woher weißt du denn, dass bei as.get() dein AsyncTask wirklich fertig ist?
    Ich habe das so verstanden, dass das nur in der onPostExecute() des AsyncTask gestgestellt werden kann.
    Was übersehe ich da?

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!