Pęta i update TextView

0

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

0

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

0

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.

0

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

        }
1

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.

0

dzieki ;)

0

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!")
              }
1

textView.text = "${textView.text}\n$komunikat"

0

dzieki dzieki

0

jeszcze jedna uwaga. nie wiem jak u Ciebie z angielskim ale programuj w j.angielskim. im wczesniej zaczniesz tym lepiej dla Ciebie :)

0
Przeciwnik.nazwa.toUpperCase()
Opponent.name.toUpperCase()

tak troche lepiej ;)

0
 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 :)

0

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)
            }
0

nie do końca wiem co chcesz zrobić ale nie robi się sleep na MainThread, bo aplikacja przestaje być rezponsywna.

0

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

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1