Mein TextSwitcher
für jeden Datensatz in ListView
sollte den ersten Wert anzeigen ( text1 ) und dann einen anderen Wert ( text2 ), dann den ersten Wert und so weiter . Es sollte nur passieren, wenn text2 nicht leer ist. Andernfalls sollte text1 immer angezeigt werden (ohne Änderungen und Animationen).
Ich habe Runnable()
erstellt, was die boolesche Variable ( time2 ) ändert, um dann items.notifyDataSetChanged()
aufzurufen. Es funktioniert wie erwartet und im Ergebnis setViewValue()
für meine ListView
heißt.
Hier ist der Code:
%Vor%Es funktioniert fast wie erwartet. Mit einem kleineren Element - wenn text2 angezeigt werden soll, wird der angezeigte Wert zuerst auf einen anderen Wert geändert (aus einem anderen Datensatz!) Und dann wird eine Animation abgespielt. Die Änderung von text2 in text1 erfolgt korrekt.
Ich verstehe, dass der Grund folgender ist: Vor der Anzeige von text2 werden alle Ansichten von itemTime
entfernt und daher neu erstellt, und deshalb wird für eine Sekunde ein anderer Wert angezeigt. Aber warum zeigt es Wert von einem anderen Datensatz?
Eigentlich text2 und text1 sind Werte aus der Datenbank, z.
text2 = cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_TIME_2))
, wahrscheinlich stimmt hier etwas nicht und setViewValue
wird mit falschen Parametern aufgerufen?
Upd. text1 und text2 werden aus der Datenbank unter setViewValue
gelesen. Hier ist ein Beispiel für den vollständigen Code:
Ich denke, ich sehe, was hier vor sich geht, und das liegt an der Funktionsweise von ListView.
ListView recycelt alle Ansichten intern, so dass nur so viele Ansichten erstellt werden können, wie auf dem Bildschirm angezeigt werden können. Dies bedeutet jedoch auch, dass Sie beim Binden von Werten an eine Ansicht in der setViewValue-Methode nicht immer die Ansicht erhalten, die sich an derselben Position in der Liste befand.
Angenommen, Sie haben drei Listenelemente: itemA, itemB, itemC in dieser Reihenfolge. Jeder enthält zuerst text1, text2 und text3.
Wenn Sie items.notifyDataSetChanged()
aufrufen, recycelt ListView alle diese Listenelemente, so wie es sich anfühlt. Sie können also eine neue Reihenfolge von itemC, itemA, itemB; und der Text würde dann Text3, Text1, Text2 lesen.
Wenn Sie also den Text des ersten Listenelements in "text2" ändern, sehen Sie tatsächlich, dass "text3" zu "text2" wechselt, anstatt wie bei Ihnen von "text1" zu "text2" zu wechseln erwartet.
Ich weiß, dass dies die Frage vielleicht nicht direkt beantwortet, aber ich werde auf Ihren Kommentar über das Erstellen eines Runnable()
antworten, um die Arbeit für Sie zu erledigen, weil ich vermute, dass es wahrscheinlich mit Ihren Daten zu tun hat um zu sagen, wenn Sie den vollen Code nicht sehen können.)
Ich empfehle Ihnen, anstelle eines TextSwitcher
einen ViewFlipper zu verwenden. Der Grund dafür ist, dass Sie, sobald Sie die TextView
in Ihrem ViewFlipper
hinzugefügt haben, einfach Ihr Flip-Intervall einstellen und dann das Spiegeln starten können, und das wird es automatisch für Sie tun.
So einfach ist das:
%Vor% In Ihrer aktuellen Methode, die Sie beschrieben haben, entsteht beim Aufruf von items.notifyDataSetChanged()
ein enormer Performance-Treffer, weil alle Elemente Ihrer Datenbank erneut gelesen werden und Ihre Liste erneut "neu gezeichnet" wird. Sie sollten das nur tun, wenn sich Ihre tatsächlichen Daten wirklich geändert haben, anstatt sie zu verwenden, um zwischen bereits vorhandenem und nicht geändertem Text zu wechseln.
Als eine nette Überraschung bemerken Sie vielleicht, dass Ihr Problem verschwindet, weil Sie nicht noch einmal alles von Ihrer DB neu lesen müssen und die Wahrscheinlichkeit einer Verwechslung von item1 und item2 verringert wird, da Sie nur noch lesen müssen sie einmal, wenn die Zeile in Ihrem ListView
Nur meine 2 Cent.
Lassen Sie mich wissen, wie es geht.
Tags und Links android sqlite android-listview