1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ImageView in ListView: Scroll "ruckelt"

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von andy572, 13.09.2010.

  1. andy572, 13.09.2010 #1
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    Hi @all,

    habe eine ListView erstellt, diese beinhaltet folgendes Layout als ListItem (Attribute sind im "richtigen" XML sind natürlich vorhanden):

    Code:
    <LinearLayout>
      <ImageView/>
      <LinearLayout>
        <TextView/>
        </TextView>
      </LinearLayout>
    </LinearLayout>
    
    Nun zum Problem:
    Es werden z.T. Images aus dem Internet geladen, was soweit funktioniert - Aaaaber: Nachdem alles geladen ist und die Liste angezeigt wird, sieht auf den ersten Blick alles ganz nett aus, aber beim scrollen auf dem Phone fängt die ganze Geschichte an zu ruckeln bzw stottern. Klingt für mich als etwas erfahrener Programmierer nach einem "ReDraw"-Event das sicherlich ausgelöst wird beim scrollen. Kann man was dran drehen ? Evtl. irgendeinen "Draw"-Cache oder sowas ?

    Kann auch sein, dass ich was falsch verstanden habe:
    Die Bilder aus dem Internet werden über die Drawable-Funktion geladen, evtl. hängt auch dort der Fehler...

    Bin für jeden Hinweis dankbar ;)

    LG
    Andy
     
  2. ko5tik, 13.09.2010 #2
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Rückeln == Garbage Collection == Du Hast mit dem Speicherverwaltung mist gebaut ;)
    ( höchtswahrscheinlich )
    Zeige mal wie due die Bilder lädst, und wie deiner List-Adapter aussieht.
     
  3. andy572, 13.09.2010 #3
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    Hat sich soeben erledigt:

    Ich Depp hab die Bilder aus dem Internet in der getView() Function im ListAdapter geladen... was natürlich verkehrt ist - verursacht glaube auch etwas viel Daten-Transfer auf der Leitung :D

    Habe die Funktionen dazu nun ausgelagert in die Funktion, die die Liste initialisiert bzw füllt und siehe da - es funktioniert "sauber" und es scrollt wieder smooth :)

    Danke trotzdem & LG
    Andy
     
  4. ko5tik, 13.09.2010 #4
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    GetView wird immer dann aufgerufen wenn ein Listeintrag sichtbar wird.
    Unter Umständen ist es sogar sinnvoll, die mitlegieferte Views zu recyclen
    ( Ich habe Listen mit 1000+ Einträgen - wenn man es nicht macht, ist Telefon mit nur mit Garbage collection beschäftigt )
     
  5. andy572, 13.09.2010 #5
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    Nach etwas Debug habe ich das auch gesehen, hätte ich auch gleich drauf kommen können - schließlich wird da ja explizit nach einem Item mit "position" gfragt ;)

    Eine Frage noch:
    Wie kann man eine View "recyclen" ?

    Noch was:
    Der erste Wechsel zwischen den Tabs, die die Anwendung eigentlich ausmachen dauert es etwas, bis die Tabs dann nach dem Touch wechseln - aber nur beim ersten aktivieren. Wechsel ich danach hin und her, reagieren die Tabs "normal". Werden Tabs erst zur Laufzeit "gefüllt" und deren Inhalt auch erst ? Kommt mir zumindest so vor. Oder ich hab auch hier Code an der falschen Stelle plaziert - bin mit Android erst seit paar Tagen zu Gange ;)
     
  6. ko5tik, 13.09.2010 #6
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Schaz mal die Signature:

    public View getView(int i, View convertView, ViewGroup viewGroup)

    mit dem convertView ist eine View gemeint, die Framework gegebenfalls gerne recyclen würde.
    Also:
    - überprufen ob die vorhanden ist ( != null )
    - übweprüfen ob passender Typ ( bei mir gibt Es verschiedene Typen für Highscore / aktuellen Wert


    Code:
    
    
                result = convertView;
                if (result == null || result.getId() != R.id.regular_highscore_view) {
                    // reuse view
                    result = LayoutInflater.from(context).inflate(R.layout.highscore_list_entry, viewGroup, false);
                    //System.err.println("create new layout");
                } else {
                    //System.err.println("reused layout ");
                }
    
    
    
    ( ID kommt aus dem XML-Layout )
     
    andy572 bedankt sich.
  7. andy572, 13.09.2010 #7
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    Ach soooo ... "reusable code" ist gemeint ^^

    ja, das hab ich schon an einigen stellen verbaut, hab neulich schon was gefunden über Optimierung beim Android Framework, aber sowas macht man ja generell in der Programmierung. Komme ursprünglich aus der C++ Ecke und da achtet man auch drauf daß der Heap nicht vollgemüllt wird sondern zB. man auch mal ein "delete" nutzt ;)
     
  8. ko5tik, 14.09.2010 #8
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    In diesen Fall ist es nich Code das wiederverwendet wird, sondern die Objekte
    (Widgets) - man muss die nur neu konfigurieren, mit neuen Texten versehen und
    einen neuen Parent zuweisen - also erst mal gar keinen delete() verursachen
     

Diese Seite empfehlen