Hilfe beim einbinden von RecyclerView oder LiestView in Fragment

  • Habe es ein wenig geändert.

    Du bist der Wahnsinn! Vielen lieben Dank du bist mein Retter :) !

    PS: das mit dem runOnUI im Fragment1 ist immer noch falsch.

    Hatte ich schon mal gesagt.

    Erledigt, danke für den Hinweis :)



    Eine Sache noch :)

    Ich hätte nun versucht, nachdem man auf Song Singen klickt, dass er automatisch in den ersten Tab wechselt, wo er auch die Daten in die Box schmeißt.


    Code: JsonAdapter
    private ViewPager mViewPager;


    Ist der Ansatz schon mal korrekt oder bin ich wieder auf der falschen Fährte? ^^


    LG

  • Hallo richtig du brauchst in dem Listener die Instanz vom ViewPager. Um darauf setCurrentItem( dein Tap zb 0) auszuführen.

    Nur wie du versuchst die Instaz zu holen ist falsch.


    Denke nach wo der den Pager erstellt wird. Welchen Context brauchst du da, und was hast du?

    Da würde der Fragmentmanager in Spiel kommen. Weil du im Fragment nicht so einfach an die Instanz des ViewPager ran kommst.



    Aber du kannst es genauso mit dem ViewModel und einen Observer in der MainActivity machen.

    Dort also ein MutableLiveData Objekt vom Typ Integer beobachten und den Viewpager mit setCurrentItem setzen.

    Ob du dazu eine Methodenreverenz oder ein Lmabda benutz ist dir überlassen.


    Methodenreverenz in C# -> Delegate

    Observer Pattern gibt es da auch.



    ViewModel overview  |  Android Developers
    ViewModel lets you manage your UI's data in a lifecycle-aware fashion.
    developer.android.com

  • Hi. Also die Instanz sie zu holen meinst du das?

    Code
     mViewPager = mViewPager.findViewById(R.id.view_pager);


    Wenn ich richtig liege wird der ViewPager in der MainActivity.java erstellt und auch der Adapter zugewiesen oder?

    Der Fragmentmanager ist in der VPAdapter.java

    Wenn ich dich jetzt richtig verstehe, müsste ich also in der VPAdapter.java die Instanz des ViewPagers setzten?


    Was für eine Variante wäre den einfacher zu verstehen? Für mich klingt ViewModel und einen Observer in der MainActivity einfachen.. oder ist dem nicht so?

    LG

  • Zitat

    Was für eine Variante wäre den einfacher zu verstehen? Für mich klingt ViewModel und einen Observer in der MainActivity einfachen.. oder ist dem nicht so?

    LG

    Das sagte ich ja. Das es mit dem Viewmodel einfacher ist.

    Du erstellt in dem Viewmodel ein MutableLiveData Objekt vom Typ Integer. Natürlich auch die Getter und Setter.

    Listener und Activity klannst du so darauf zugreifen.

    Ist im grunde genau wie das mit den Strings.

  • Ah.

    Langsam komm ich im Gedanken etwas dahinter :)

    klar... du gibst mit

    Code: JsonAdapter.java
    mainModel.setSongTitel(stitel);
    mainModel.setInterpret(sinterpret);

    ja dem Viewmodel dadurch die Infos von Titel und Interpret, die er dann dort weiterverarbeitet.

    Was mir allerdings noch unklar ist, warum eine Integer-Variable?

    Muss ich den die ID vom view_pager mitgeben oder kann ich das dann auch dort in der MainActivityViewModer erledigen?


    Ich hätte es so in etwa versucht, aber leider ohne Erfolg. (App stürzt ab)


  • Das findViewById und setzen des faragment gehör nicht in das Viewmodel.

    Sondern in die Activity wo du auch schon den Viewpager gesucht hast. Und somit auch die Instanz hast.


    Das findViewById bsuchst du nicht.

    Das Viewmodel ist nur der übermittelt quasi ein Buffer auf den beide zugreifen können. Der Listener und die Activity.

  • Hey :)


    Also gehört das findViewById und setzen des faragment in die JsonAdapter.java?

    von dort gebe ich quasi die Anweisung an das ViewModel das er mir die page switchen soll? mit

    ist das so schon mal richtig?


    im Viewmodel hab ich das was du gesagt hast noch ergänzt:

    So weit, richtig?

    Danke schön :)

    LG :)

  • Zitat

    Also gehört das findViewById und setzen des faragment in die JsonAdapter.java?


    Nein das findViewById ist und bleibt in der Mainactivity.



    Zitat

    von dort gebe ich quasi die Anweisung an das ViewModel das er mir die page switchen soll? Mit


    Nicht ganz du speicherst den Zustand in dem ViewModel. LiveData ist sozusagen eine besondere Variable was den Wert aufnimmt und speichert.


    Beide Klassen (Activity und Adapter) können nachdem sie sich die Instanz von dem ViewModel geholt haben darauf zugreifen.

    Das Machst du mit dem ViewModelProvider, wie du den In der Activity einsetzt kannst du dir in den schon verlinkten Dokus ansehen.

    So und nun kommt der Besondere DatenTyp (Klasse) ins Spiel. Der der lässt sich auch mit einen Observier auf Veränderungen beobachten. Der Observier kann dann eine Action ( Methode )ausführen zb dein setCurrentItem().

    Das macht er unabhängig deinen zutuen wenn er eine Veränderung in der Variablen bemerkt.

    Ich hoffe der Sachverhalt ist jetzt klar geworden.



    Was du da als Action benutz ist dir überlassen MethodenRef Lambda oder Klassisch eine anonyme Klasse ist dir überlassen.

    Sogar eine eigne nicht anonyme Klasse ist möglich. Ich bevorzuge die MethodenRef seit Java8.



    Anonyme Klasse wäre das.

    Code
    final Observer<Integer> nameObserver = new Observer<>() {
                @Override
                public void onChanged(@Nullable final Integer newValue) {
                    viewPager2.setCurrentItem(newValue);
                }
            };
            mainModel.getPage().observe(this, nameObserver);


    Bei den EditTexten ist das Ja genau dasselbe.

    Ich glaube du solltest dir die Grundlagen von OOP und vor allen den LifeCycle einer Activity anschauen.

  • Zur Frage ob dein Viewmodel richti ist ?

    Kannst du dir selber beantworten wird es Kompiliert ja oder nein? Nein es wird einen Fehler geben.


    Ist die Methode findViewById in der Klasse verfügbar?

    Wo in Welcher Android Klasse ist die Methode laut Doku vorhanden?

    Wovon erbt dein Adapter erbt er von Activity so das du die Methode benutzen kannst?

    Das sind Fragen die du dir selber stellen solltest.




    Dein Adapter sollte passen.

  • Ich bin jetzt mal ganz ehrlich :(

    Das überfordert mich gerade ziemlich und gebe dir recht damit, dass ich mir erstmals die Grundlagen ansehen hätte müssen.

    Ich blicke da einfach nicht durch.

    Meine Kenntnisse reichen für diese mächtige Programmiersprache einfach nicht aus und bin in einem Alter wo ich das vermutlich nicht mehr aus Zeitmangel und fehlendem Wissen erlernen kann / will.


    Würdest du vielleicht so nett sein (auch gegen eine kleine Spende) mir das fertig zu stellen, dass wenn man auf Song singen in im zweiten Tab klickt, er auf den ersten Tab springt? Dann hätte mein Kopf und deine Nerven endlich Ruhe und würde dir dafür unendlich dankbar sein ^^


    Es ist normalerweise nicht meine Art aufzugeben, aber das ist mir echt zu kompliziert ohne die Grundlagen erlernt zu haben. Bin ja schon froh darüber, es überhaupt so weit geschafft zu haben, mit Tutorials Hilfe von dir :)


    LG

  • Na so schwer sollte der Rest doch nun auch nicht mehr sein.


    Ich hoffe du siehst es dir wenigstens an und versuchst es zu verstehen. Eigentlich hast du den gesamten Code nun schon von mir bekomme musst ihn halt nur noch zusammen bauen.



    Zitat

    Meine Kenntnisse reichen für diese mächtige Programmiersprache einfach nicht aus und bin in einem Alter wo ich das vermutlich nicht mehr aus Zeitmangel und fehlendem Wissen erlernen kann / will.


    Java (1995) ist nicht mächtiger als C# (2000), Java ist sogar ca. 5 Jahre älter als „C#‘ und das kannst du ja sagst du im ersten Post.



    Ich persönlich habe auch erst ca. vor 5 Jahren mit Java angefangen wegen Android.

    Bin auch nicht mehr der Jüngste. Also gebe dich nicht auf.



    Dann noch gutes Gelingen mit deiner App.

  • Hab vielen lieben Dank!

    Ja, ich werde mir das die Tage mal genauer ansehen, um es auch zu verstehen. :)

    Könntest du bitte die Dateien bzw. die App hier aus dem Forum nehmen? Weil ja die App mit meiner DB kommuniziert und die nicht jeder haben sollte :)


    Vielen vielen Dank nochmals!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!