wozu künstlich delays einbauen wenn der text auch sofort da sein kann?
XML-Daten in eine ListView einlesen
-
-
Damit es so aussieht als würde jmd tippen quasi. Aber ohnehin müssen ja delays eingebaut werden da textbox für textbox angezeigt werden soll.
-
Ja aber die Frage ist doch warum? Warum sollen nicht ohne verzögerung beim öffnen der activity der Text erscheinen?
-
Vllt reden wir auch ein bissl aneinander vorbei. Also ich meine es genauso wie die App zeigt, also der Link, den ich gepostet habe. Der User öffnet die App und es kommen direkt Nachrichten rein die aber einen 2 Sekunden Abstand haben DAS möchte ich einbauen. Warum? Weil der Spieler ja nicht so schnell lesen kann das eine Textbox bis zur anderen bis zur Entscheidung erscheint. Verstehst du was ich meine?
-
ok jetzt verstehe ich was du meinst, sorry mein fehler. Ja das ist möglich. Da wird einfach einem Recyclerview über den adaoter ein neues Item hinzugefügt
-
Jop, bekomme ich bestimmt hin. Aber wo ich mir jetzt die Zähne kaputt beiße ist diese Verzögerung. Wie kann man eine einfache Verzögerung einbauen? Habe einige Möglichkeiten ausprobiert, aber es hat entwender nicht funktioniert oder es war ellenlanger Code, das kann ich mir nicht vorstellen dass es so lange dauert? Gibt es nicht sowas wie eine pause() Funktion mit Millisekundenwert als Parameter?
-
Nennt sich in Java Timer, in Android gibt es noch den Countdowntimer
-
Bin gerade an einer Lösung dran, die nicht funktioniert und ich nicht verstehe warum. Also habe hier mein onBindViewHolder, der die Textboxen auf dem Bildschirm erscheinen lässt. Jedes mal, wenn er eine Textbox erstellt hat, soll eine 5 sekündige Pause eingelegt werden, bis das nächste erscheint. Habe das so gelöst:
Java
Alles anzeigenpublic void onBindViewHolder(RecyclerViewHolder holder, int position) { int zaehler = 0; while(zaehler <= storyTexts.length) { holder.Tx_storyTexts.setText(storyTexts[position]); DerTimer(); zaehler++; } }
DerTimer() wird dann aufgerufen mit diesem Code:
Java
Alles anzeigenpublic static void DerTimer(){ Handler handler; /** RUN PROZEDUR **/ handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { } }; handler.postDelayed(runnable,5000); }
Wenn ich die App starte, dann bekomme ich sofort alle Einträge ohne Verzögerung angezeigt, warum?
-
Das geht für diesen Anwendungsfall nicht.
Du möchtest das dein MainThread 5s wartet und dann weiterarbeitet. Was du aber mit dem Timer bezweckst ist, einen zweiten Thread parallel zu deinem MainThread zu betreiben, der nach 5s irgendwas tut. Das heißt beide Threads laufen einfach weiter, der Timer startet aber halt erst nach 5s.
in der onBindViewHolder Methode kannst du ein Thread.sleep() aufrufen, das sollte den zweck erfüllen. Aber mir stellt sich die Frage, warum du das möchtest. Ich dachte du willst nach 5 sekunden ein neues Item zu deiner Liste hinzufügen und nicht aller 5s den Text deiner TextView ändern.
-
Aaaachso, na das erklärt ja einiges.
Ja in dem onBindViewHolder steht ja "holder.Tx_storyTexts.setText(storyTexts[position]);", setzt diese Zeile nicht ein ListItem nach dem anderen bis die while-Schleife fertig ist?
-
die methode setText sagt doch schon alles. Tx_storyTexts ist eine TextView vermute ich jetzt mal ohne den Code zu kennen. wenn du darauf ein setText anwendest, wird eben der Text der Textview geändert.
-
D.h. ich muss immer ein neues ListView erstellen und dann den Text einmalig setzen. Kann ich das alles in der onBindViewHolder machen?
-
neee das wäre ja extremer overhead. Eine Listview besteht aus Items du musst nach deiner definierten Zeit ein neues Item hinzufügen.
Noch ein kleiner hinweis, versuchs mal mit einem ArrayAdapter.
-
Ach quatsch ich meine natürlich neues ListItem nicht View. Also im Grunde einfach ein ArrayAdapter nehmen, diesen mit der RecyclerView verbinden und dann nach einer bestimmten Zeit Items hinzufügen ja?
-
So, Erfolg!
Habe einen RecyclerView, mit ArrayList, und diese Liste wird bestückt. Wenn ich Thread.sleep() anwende, und bspw. 1000 Millisekunden eintrage, dann laggt das ganze und ich habe so 8 Sekunden einen eingefrorenen Bildschirm dann wird auf einmal alles angezeigt. Ist glaube ich nicht so elegant.
Nächste Frage: Wenn ich jetzt Entscheidungen einbauen will, mein Vorschlag. Habe ja ein String Array mit dem ganzen Text drin (jeder Satz ist indexiert). Am besten wäre es doch jetzt eine for-Schleife zu erstellen, die bis zum Index 3 läuft. So werden die ersten 3 Sätze angezeigt. Jetzt kommt eine Entscheidung, die linke Entscheidung bekommt den Stringindex 4 und die Rechte Index 5. Wenn jetzt jmd links drückt, dann springt man weiter zu Index 6, bei rechts zu Index 12.
Muss man das im Adapater realisieren?
-
warum fragst du den text nicht aus der datenbank ab, sondern hast ein riesiges array von texten?
-
Jo stimmt, könnte ich noch ändern bzw. werde ich auch noch ändern aber mir ist erstmal wichtig, die Grundfunktionen hinzubekommen, besonders das Entscheidungszeug und diese Verzögerung. Das Datebankzeugs ist ja einfacher.
Könntest Du noch was zu meiner Idee sagen?
-
naja die idee mit der for schleife würde dann halt entfallen. du könntest in der datenbank z.b. für jede frage zwei spalten extra einplanen. Eine für den einen entscheidungszweig und eine für den anderen. In die jeweiligen entscheidungszweige packst du dann einfach die ids der jeweiligen textbausteine rein.
Kurz:
2 Tabellen, eine für die textbausteine und eine für die verbindungen der einzelnen bausteine.Wenn du mit Android ressourcen arbeitest statt einer Datenbank, brauchst du nur eine Tabelle für die Entscheidungen. Dort kannst du die Ressource IDs vernetzen. Das würde ich aber nicht empfehlen, denn falls sich eine Ressource ID mal ändert, ist die referenzielle intigrität deiner datenbank nicht mehr gesichert und die vernetzung der textbausteine könnte kaputt gehen.
-
Eine Verständnisfrage. Ich habe jetzt die Datenbank mit zwei Tabellen erstellt. Aber wie bekomme ich jetzt meine Daten darein? Ich kann in der MainActivity ja ein "myDB.insertData(STRING)" aufrufen und dann bin ich aber wieder bei meinem Array und einer for-Schleife bis alle Daten in die DB eingelesen wurden oder liege ich ganz falsch?? Kann ich nicht manuell wie in Microsoft Access die Daten eingeben und so die Datenbank dann aufrufen?
Dankee
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!