RecyclerView nicht aufrufen onScrolled an der Unterseite

Ich versuche zu schaffen, eine RecyclerView mit Paginierung und ich habe ein problem mit dem zeigen Fortschrittsbalken, wenn ich versuche zu scrollen, schon ganz am Ende der Liste. Es gibt eine callback – RecyclerView.OnScrollListener hat eine Methode onScrolled für den Umgang scroll-Ereignisse, aber es funktioniert nicht, wenn keine tatsächlichen scrollen passiert ist.

Gibt es onScrollStateChanged Methode, die funktioniert, wenn ich versuche zu scrollen, nach unten von der Unterseite, aber meine Logik verlangt von mir zu wissen, die Richtung der gesten (up/down), so ist diese Methode nicht hilfreich in meiner situation.

Ich derzeit versuchen, es zu tun so etwas wie dieses (was offensichtlich nicht funktioniert):

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            fetchDataFromServer();
        }
    });

EDIT: ich habe versucht, zu erkennen, wenn das Ende erreicht ist, in onScrolled und es irgendwie funktionierte, aber manchmal, wenn ich versuchen für das abrufen der Daten vom server weiß ich nichts empfangen, so dass nach einer solchen Anfrage ich bin immer noch am Ende der Liste, und ich will nach unten scrollen, um zu versuchen, aktualisieren Sie die Liste wieder, aber ich kann nicht da onScrolled ist nicht immer genannt.

Irgendwelche Ideen auf, wie man den Fehler beheben? Ist es ein weiterer Rückruf, die ich verwenden kann?

  • Suchen Sie in Ihren source-code-Auszug und denke, Sie versuchen, zu implementieren, die Paginierung auf RecyclerView, Nein? Wenn ja, dann warum nicht versuchen, aufrufen fetchDataFromServer() im onBindViewHolder Methode statt, wenn RecyclerView.Adapter bindet die Daten zur letzten Ansicht.
  • Yep, das ist, was ich Tue, ich werde versuchen deine Lösung, danke



2 Replies
  1. 2

    Ich denke, um die Fortschritte zu zeigen am Ende der recyclerview Sie müssen nur sicherstellen, dass das Ende erreicht wurde.

    Dies ist, wie es geht –

    private int visibleThreshold = 1; //trigger just one item before the end
    private int lastVisibleItem, totalItemCount;
    
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                }
    
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
    
                    totalItemCount = mLayoutManager.getItemCount();
                    lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
    
                    if (totalItemCount <= (lastVisibleItem + visibleThreshold) {
                        //... end has been reached...
                        //... do your stuff over here...
                    }
                }
            });
        }

    EDIT:

    manchmal, wenn ich versuchen für das abrufen der Daten vom server, die ich nicht erhalten
    alles

    Einfach! Wenn Ihr Netzwerk eine Anforderung fehlschlägt, versuchen zu fangen eine Ausnahme. Wenn es SocketTimeOutException, Wiederholen tut dieselbe Anfrage nochmals. Wenn es eine andere Ausnahme(könnte von der back-end oder front-end), Bekommen es fest.

    • Ich aktualisiert meine Frage, bitte haben Sie einen Blick
    • Ich habe aktualisiert die Lösung 🙂
  2. 1

    Wenn Sie die Entwicklung für die min-sdk-level 23, dann können Sie setOnScrollChangeListener

      recyclerView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    
            }
        });
    • Danke, aber ich bin nicht die, minimale sdk-level 19

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.