Dringende Hilfe bei Listview...

M

MichaelS

Erfahrenes Mitglied
51
Hallo zusammen...

ich habe ein sehr eigenartiges Problem mit der Listview...
ganz normale Listview mit adapter usw... wenn ich die listview direkt mit setcontentview hinzufüge funktioniert alles fehlerlos... sobald ich aber irgend nen layout sei es relativelayout erzeuge und darin die listview mache, funtzt es nicht mehr... ich weiß wirklich nicht wieso....

es geht darum, in einem thread die listview zu aktualisieren bzw. dies mit einer animation verknüpft...

hier ist ein fertiges beispiel projekt...
Code:
http://rapidshare.com/files/395127605/listviewTesting.zip.html

ihr könnt es testen, in dem ihr die listview alleine auf die activity setzt und dann sollte es alle 2 sek blinken in der liste... wenn ihr es so lasst, wie es war, blinkt es nur einmal bzw. garnicht...

ich wäre echt sehr sehr dankbar, wenn wir hier schnell ein Lösungen finden könnten =)

hier nochmal die main datei...
Code:
http://pastebin.com/8vrhw4Ln

Gruß
MichaelS
 
Sebastian konnte mir ein tipp geben, dass man nach dem starten der animation mit notifyDataSetChanged es tatsache zum laufen bringt... jedoch würde mich sehr interessieren, warum es notwendig ist... falls jemand eine idee hat, kann er se gerne posten =)

edit: leider bringt die lösung doch kein richtigen erfolg... bleibt gerne mal abundzu hängen und läuft auch nicht immer an... schade... also alle lösungen oder tipps sind willkommen =)
 
Zuletzt bearbeitet:
Der Weg war lang und sehr hart.... Aber das Problem konnte tatsächlich gefunden werden... Ich hatte kein Problem mit Threads oder ähnlichen... Das Problem war der Listview Adapter und der externe FremdZugriff auf den Adapter...

Also ich hatte das Adapter System nicht richtig verstanden... ich habe Pro Listeintrag eine View erzeugt und diese gespeichert... bei erneuten GetView Aufruf, habe ich ich meinem speicher nach der View gesucht und angezeigt. Da ich die view selber gespeichert habe, konnte ich von aussen Änderungen erzwingen. Jedoch dabei liegt genau das Problem...

Es ist so vorgesehen, dass der Adapter wirklich nur die Daten speichert und nicht die Views ansich... den die Views überschreibt er einfach ständig, damit er nicht soviele Views im speicher liegen haben muss...

Also das Vorgehen ist an sich ziemlich einfach. Beim ersten GetView aufruf, hat man keine convertView. Dies bedeutet, man muss eine durch inflate erzeugen. und diese direkt mit den entsprechden Daten befüllen. Durch ein ViewHolder kann man vermeiden, dass man mit findview ständig nach den Views suchen muss.

Beim erneuten Aufruf von GetView, bekommt man eine convertView. Diese ist einfach die letzte View, die er hat... Diese überschreibt man nun einfach mit den Daten, die man braucht... also keine neue view erzeugen oder ähnliches. So bleiben im Speicher nur minimale Views statt 10000 :D

Ein gutes Beispiel findet man hier:
List14.java | Android Developers
 
  • Danke
Reaktionen: sebastian
Erstmal danke, dass du uns hier die Lösung noch mitteilst!
Kannst du erklären, warum sich das so seltsam auf die Animation auswirkt? Den Zusammenhang habe ich noch nicht ganz verstanden.


Tipp:
Falls jemand mal in den Items seiner ListView, Bilder und Checkboxen anzeigen möchte, benutzt ebenfalls solch einen eigener Adapter der den ViewHolder überschreibt! Die Checkboxen vergessen nämlich gerne ihren Checked State ;) Link mit Code dazu: Android Snippets: Clickable ListView Items
 
ganz genau, kann ich dies nicht erklären. jedoch vermute ich, dass der aufwand, die liste ständig aufwendiger bearbeitet wurde, dass sich verschiedene threads in die quere kamen oder ähnliches. Durch die Lösung, wurde die Listview um ein vielfaches schneller als vorher und hat somit keine Probleme mehr damit... Man muss erstmal versteuen, wie genau der Adapter funktioniert um nicht so Anfänger Fehler zu machen... Jedoch bin och froh, dass ich die Zeit hatte um dem Problem genauer auf die Spur zu kommen und in den Nachfolgenden Apps auch direkt richtig anwenden kann.

Man sollte sich halt merken, den Adapter wirklich nur die Daten rüberwerfen und dann halt den Adapter auch das aktualisieren der Daten zu überlassen. Wenn man sich daran hält, sollte es zu keinen Problemen kommen.

Gruß
Michael
 
Und wenn man verschiedene View-Typen in der Liste hat, solte man den ID setzten um feststellen zu können das es passendes View ist

( in meiner Highscore-Listen gibt es 2 Typen davon )
 

Ähnliche Themen

D
Antworten
17
Aufrufe
408
datNeMo
D
R
  • RudolfHagen
Antworten
1
Aufrufe
652
koje71
koje71
A
Antworten
10
Aufrufe
1.021
swa00
swa00
Zurück
Oben Unten