Mam problem z wyświetleniem wszystkich tekstów z pętli tak żeby pojawiły się w textview jeden pod drugim, a nie tylko ostatni. Trzeba użyć do tego recyclerwiev czy inaczej to można rozwiązać? Jeśli recyclerwiev to też prosilbym o nakierowanie
jak chcesz w 1 textView to rob konkatencaje stringow i dodawaj symbol nowej linii '\n'
czyli string1.plus("\n").plus(string2).plus("\n")... itd
jak bedzie duzy takich stringow to uzyj StringBuilderia
recyvlerview rozwiazuje troche inne problemy i nie ma sensu go implementowac jak bedziesz mial 10 stringow.
pokaz co masz do zrobienia lepiej
Możesz zbudować jednego Stringa z pętli i przekazać go do TextView. Nie wiem na ile ma to sens, bo nic nie napisałeś o swoim przypadku. Dodatkowo jeśli linii tekstu będzie za dużo, to nie zmieszczą się na ekranie i żeby móc przesunąć ekran, musiałbym widoki opakować na przykład w ScrollView. Wtedy RecyclerView byłby lepszym rozwiązaniem. Temat był już kilka razy wałkowany na forum, więc możesz użyć wyszukiwarki. Poza tym biblioteka jest tak popularna, że w Internecie jest pełno materiałów o niej. Chociażby bezpośrednio na stronie Google - https://developer.android.com/guide/topics/ui/layout/recyclerview.
Tak ogólnie się uczę, robię taką pseudo grę rpg i w pętli ma się toczyć walka z przeciwnikiem i później ma być wypisane w textview to co się działo np "zadałeś 6 obrażeń", "przeciwnik zadał Ci 11 obrażeń" na taki problem trafiłem, że nie potrafię updatować textview tak żeby stringi się w nim dodawały i powstał długi napis. Póki co chciałbym żeby w tej pętli wyświetliło mi: cos10987654321 a póki co wyświetla tylko ostatnią cyfrę czyli "cos1"
``` val jeden = 1
var dziesiec = 10
var napis = "cos"
while(jeden < dziesiec){
dziesiec =- 1
napis += dziesiec.toString()
textView.text=napis
}
Możesz na przykład tak.
val jeden = 1
var dziesiec = 10
var napis = ""
while(jeden <= dziesiec) {
napis += "\n$dziesiec"
dziesiec--;
}
textView.text = "cos $napis"
Takie sobie to. Jak się uczysz radziłbym napisać grę konsolową zamiast rzucać się na Androida, bo musisz najpierw załapać podstawy i schematy programowania, których Ci brakuje.
dzieki ;)
To jeszcze pytanie dotyczące głównego problemu. Jak te komunikaty z Log.d najlepiej wypisać w textwiev, bo brak pomysłów ```
if(Bohater.HP > 0){
Log.d("walka", "Uderzyles ${Przeciwnik.nazwa} zadajac mu ${Bohater.sword_fighting} obrazen")
if (Przeciwnik.hp > 0){
Log.d("walka", "${Przeciwnik.nazwa} zostalo ${Przeciwnik.hp} HP")
}
}
if(Przeciwnik.hp < 0) {
Log.d("walka", "${Przeciwnik.nazwa.toUpperCase()} NIE ZYJE")
}
if ( Bohater.HP > 0 && Przeciwnik.hp <= 0) {
Log.d("walka", "Wygrales walke zdobywasz ${Przeciwnik.exp} expa")
Bohater.exp += Przeciwnik.exp
textView_Exp.text=Bohater.exp.toString()
Przeciwnik.hp = HPprzeciwnika
break
// break
}
if (Bohater.HP <= 0 && Przeciwnik.hp > 0){
Log.d("walka", "NIE ŻYJESZ!")
}
textView.text = "${textView.text}\n$komunikat"
dzieki dzieki
jeszcze jedna uwaga. nie wiem jak u Ciebie z angielskim ale programuj w j.angielskim. im wczesniej zaczniesz tym lepiej dla Ciebie :)
Przeciwnik.nazwa.toUpperCase()
Opponent.name.toUpperCase()
tak troche lepiej ;)
textView_Exp.text=Bohater.exp.toString()
Przeciwnik.hp = HPprzeciwnika
a tutaj masz mix, Przeciwnik i HP/exp :)
nawet jezeli slabo znasz angielski to programowanie jest swietna okazja do nauki angielskiego, 2 pieczenie na jednym ogniu :)
Mam jeszcze jedno pytanie. Jest możliwość zatrzymania pętli i aktualizacja textview? Jak nie zrobie to zawsze za pomocą Thread.sleep akcja dzieje się dopiero na końcu całego cyklu pętli, a w logu mi co przejscie wyświetla rosnące cyferki
Co do angielskiego to następna apka już będzie 100% w angielskim
``` var jeden = 1
while (5 > jeden){
Log.d("msg","$jeden")
napis += "\n $jeden"
jeden++
TextView.text=napis
Thread.sleep(1000)
}
nie do końca wiem co chcesz zrobić ale nie robi się sleep na MainThread, bo aplikacja przestaje być rezponsywna.
Chodzi o to żeby co sekundę text w textview byl zmieniany na zmienna jeden w czasie rzeczywistym tak jak petla przebiega. myslalem, ze Thread.sleep zatrzymuje przejscie petli i w sumie tak robi, ale na textview tego nie widac tylko w Log.d
poczytaj czym sa wątki i jak działają wątki w androidzie. w każdym razie jeżeli chcesz wykonywać jakąś logikę to rób to w tzw. background thread a aktualizacja UI dozwolona jest tylko w UI thread.
więc powinieneś swoją logike/pętle wywołać w background thread (tam mozesz sobie uzyc sleep) a nastepnie wynik przeslac o wątku głównego (MainThread) i z niego zaktualizować UI aplikacji.