Item nimmt den gesamten Nested-Recyclerview ein.

  • 5 Antworten
  • Neuester Beitrag
Diskutiere Item nimmt den gesamten Nested-Recyclerview ein. im Android App Entwicklung im Bereich Betriebssysteme & Apps.
J

JennyLessner

Neues Mitglied
Hallo zusammen, mein Name ist Jenny
:)


Ich möchte gerne RSS-Feeds parsen und die in meinen Nested-Recyclerview anzeigen lassen, was auch klappt.

Nur habe ich das Problem, dass das erste RSS-Feed den gesamten Recyclerview einnimmt und die andere RSS-Feeds nicht angezeigt werden.

Ich habe nun herausgefunden, dass das an den ArrayList liegt, wo der Konstruktor meiner Setter-Getter-Klasse sich befindet.

Nun weiß ich aber nicht, wie ich am besten dieses Problem lösen könnte.

Java:
 protected void onPostExecute() {

        //updated the UI
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(() -> {

            childModelList.add(new ChildModel(title, description, image, date, duration, audioURL, keywords, summary, author));
            parentModelList.add(new ParentModel(category, childModelList));

            recyclerView = mainActivity.findViewById(R.id.parentRecyclerview);
            layoutManager = new LinearLayoutManager(mainActivity);
            recyclerView.setLayoutManager(layoutManager);
            parentRecyclerViewAdapter = new ParentRecyclerViewAdapter(mainActivity, parentModelList);
            recyclerView.setNestedScrollingEnabled(false);
            recyclerView.setAdapter(parentRecyclerViewAdapter);

        });



Über einen Konstruktor von meiner Parser-Klasse kann ich auf die ID der Recyclerview zugreifen, deswegen der Name mainactivity.findViewById

Screenshot_20220929_091205.png




Mit freundlichen Grüßen

Jenny
 
Zuletzt bearbeitet von einem Moderator:
Bearbeitet von hagex - Grund: Bildvorschau standardisiert. Gruß von hagex
swa00

swa00

Moderator
Teammitglied
@JennyLessner


Hallo Jenny,
willkommen in unserem Forum.

Ich habe nun herausgefunden, dass das an den ArrayList liegt, wo der Konstruktor meiner Setter-Getter-Klasse sich befindet.
Wie sieht denn dein Adapter resp. dein Model und vor allem deine Arraylist jetzt aus ? (Ich sehe keine ArrayList)
Grundsätzlich musst du VORHER die komplette Arraylist aus Model erstellen , füllen und dann erst an den Adapter übergeben.
(Seltenst beim Init des Adapters)

P.S Wo verwendest du denn onPostExecute ? Das sieht mir stark nach einem deprecated Style eines Tasks/Threads aus.
Denn wenn der nicht sauber läuft , wird auch deine Dataset Mimik des Recyclerview unsauber laufen.
 
Zuletzt bearbeitet:
J

JennyLessner

Neues Mitglied
Hallo Swa00,

Ich benutze ein Asynctask für das Parsen und in der onPostExecute werden die Werte übergeben.

Die Arraylisten sind global

Java:
private static List<ParentModel> parentModelList = new ArrayList<>();
    private final List<ChildModel> childModelList = new ArrayList<>();


ParentModel
Java:
public class ParentModel {

    List<ChildModel> childModelList;
    private String Category;


    public ParentModel(String category, List<ChildModel> childModelList) {
        this.Category = category;
        this.childModelList = childModelList;
    }

    public List<ChildModel> getParentModelList() {
        return childModelList;
    }


    public void setCategoryItemList(List<ChildModel> categoryItemList) {
        this.childModelList = categoryItemList;
    }

    public String getCategory() {
        return Category;
    }

    public void setCategory(String categoryTitle) {
        this.Category = categoryTitle;
    }
}

Gruß


Jenny
 
swa00

swa00

Moderator
Teammitglied
Hallo Jenny,



zu 1)
Ich benutze ein Asynctask für das Parsen und in der onPostExecute werden die Werte übergeben.
Nicht nur das Parsen, du bildest Instanzen einer UI Komponente mit eigenem Thread und setzt Adapter Daten ........
Du musst immer darauf achten , wenn eine Technik bereits deprecated ist - Dazu immer die originale API Dokumentation
verwenden.

Zu AsyncTask
https://developer.android.com/reference/android/os/AsyncTask
(der meist rote dicke Kasten :) )

Zumal AsyncTask kein richtiger Thread ist , er kann nur mit speziellen Flags dazu gebracht werden, wirklich als Thread zu arbeiten, ansonsten blockieren sich alle AsyncTasks im selben Context gegenseitig .
Wenn du schon einen Thread verwenden möchtest, dann muss beim Zugriff auf die UI ( also dein ReyclerView) dies in einem Thread der UI ausgeführt werden (runOnUiThread(new Runnable())
Understanding Activity.runOnUiThread()
How do we use runOnUiThread in Android?


Zu 2)
Auch hier stimmt leider der Adapter nicht - der sollte so aussehen

How to Use View Binding in RecyclerView Adapter
What is the right way of Android View Binding in the RecyclerView adapter class?

Ich vermute , du übernimmst deinen Code ungeprüft aus dem Internet.
Man kann zu 90% davon ausgehen, dass dieser nicht 1:1 anwendbar ist - maximal um sich eine Gedankenlinie zu bauen.

Also bitte IMMER nach der originalen API Documentation ausgehen und umsetzen.
 
Zuletzt bearbeitet:
J

JennyLessner

Neues Mitglied
Hallo, @swa00!

1.

Vielen Dank für deine Nachricht und ich habe mir mal die Docs durch gelesen und werde mich mal genauer mit den Executor auseinander setzen. Habe schon was davon auf Youtube gesehen, aber mich nicht weiter damit auseinander gesetzt und so wusste ich auch nicht, dass Asyntask veraltet und nicht mehr empfohlen wird, auch dass das eher für kurze Ausführungen geeignet ist/war.

2.

Auch hier bedanke ich mich für den Doc. Ich kam auf

Java:
   //updated the UI
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(() -> {
        });
weil ich am Anfang eine Fehlermeldung bekommen habe, dass nur der Hauptthread Zugriff auf den Recyclerview hat und ich dann bei StackOverFlow die vermeintliche Antwort gefunden habe.
Jetzt weiß ich es besser.

3.

Ich habe ausversehen dir kein Adapter Class mitgeliefert, ich habe natürlich eine Recyclerview adapter class vorhanden, nur war ich gestern echt müde nach der Arbeit. :)

Geht das überhaupt ohne adapter class?


In der Zukunft werde ich mehr Docs lesen, um immer auf den neuesten stand zu sein.


Ich bedanke mich für deine Hilfe.

Jenny
 
Zuletzt bearbeitet:
swa00

swa00

Moderator
Teammitglied
Geht das überhaupt ohne adapter class?
Kurz und Bündig : Für deinen Zweck nein :)

Nur habe ich das Problem, dass das erste RSS-Feed den gesamten Recyclerview einnimmt und die andere RSS-Feeds nicht angezeigt werden.
Ohne auch nur ansatzweise zu wissen , wie von Begin an ( Init, Daten Request etc.) dein Workflow aussieht , kann man recht wenig Dir eine zielführende Antwort auf deine ursprüngliche Frage geben.

Es spielen dabei so viele Faktoren eine Rolle, bei der eine Kleinigkeit schon der Auslöser sein kann.
Ich vermute aus unserem derzeitigen Verlauf, dass du dem UI nicht genügend "Luft" zum Atmen gibst


Es ist ein recht komplexes Thema, denn du musst quasi in mindestens drei Threads arbeiten , wenn du online RSS Inhalte verarbeiten möchtest - am besten noch mit Listenern und Callbacks.

Das soll ja im Endeffekt Alles asynchron laufen.

Zum Einem hast du den online Request-Thread, dann den Thread für die Verarbeitung/Sicherung , und zum Schluss den RecyclerView (Main UI Thread) mit der Interaktion in der Liste ( z.b. Click) .
(Danach wieder wahrscheinlich einen View für den gewünschten Inhalt)

Das ist schon ziemlich "happig" :)
 
Zuletzt bearbeitet: