381 Stimmen

Wie implementiere ich eine endlose Liste mit RecyclerView?

Ich möchte ListView in RecyclerView ändern. Ich möchte das onScroll des OnScrollListener in RecyclerView verwenden, um festzustellen, ob ein Benutzer ans Ende der Liste gescrollt ist.

Wie kann ich feststellen, ob ein Benutzer ans Ende der Liste gescrollt ist, damit ich neue Daten von einem REST-Dienst abrufen kann?

6voto

Auch wenn es so viele Antworten auf die Frage gibt, möchte ich unsere Erfahrung bei der Erstellung der endlosen Listenansicht teilen. Vor kurzem haben wir einen benutzerdefinierten Karussell-LayoutManager implementiert, der zyklisch arbeiten kann, indem die Liste unendlich gescrollt und bis zu einem bestimmten Punkt gescrollt wird. Hier ist eine ausführliche Beschreibung auf GitHub.

Ich empfehle Ihnen, sich diesen Artikel mit kurzen, aber wertvollen Empfehlungen zur Erstellung von benutzerdefinierten LayoutManagern anzusehen: http://cases.azoft.com/create-custom-layoutmanager-android/

5voto

erdna Punkte 3962

OK, ich habe es gemacht, indem ich die onBindViewHolder Methode von RecyclerView.Adapter verwendet habe.

Adapter:

public interface OnViewHolderListener {
    void onRequestedLastItem();
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    ...

    if (position == getItemCount() - 1) onViewHolderListener.onRequestedLastItem();
}

Fragment (oder Activity):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    contentView = inflater.inflate(R.layout.comments_list, container, false);
    recyclerView = (RecyclerView) mContentView.findViewById(R.id.my_recycler_view);
    adapter = new Adapter();
    recyclerView.setAdapter(adapter);

    ...

    adapter.setOnViewHolderListener(new Adapter.OnViewHolderListener() {
        @Override
        public void onRequestedLastItem() {
            //TODO neue Daten vom Webservice abrufen
        }
    });
    return contentView;
}

4voto

Anirudh Punkte 2457
 recyclerList.setOnScrollListener(new RecyclerView.OnScrollListener() 
            {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx,int dy)
                {
                    super.onScrolled(recyclerView, dx, dy); 
                }

                @Override
                public void onScrollStateChanged(RecyclerView recyclerView,int newState) 
                {
                    int totalItemCount = layoutManager.getItemCount();
                    int lastVisibleItem = layoutManager.findLastVisibleItemPosition();

                    if (totalItemCount> 1) 
                    {
                        if (lastVisibleItem >= totalItemCount - 1) 
                        {
                            // Das Ende wurde erreicht
                            // mach etwas 
                        }
                    }          
                }
            });

3voto

speedynomads Punkte 2602

Ich habe eine Implementierung des unendlichen Scrollens mit dieser Logik in der onBindViewHolder-Methode meiner RecyclerView.Adapter-Klasse erreicht.

if (position == mItems.size() - 1 && mCurrentPage <= mTotalPageCount) {
    if (mCurrentPage == mTotalPageCount) {
        mLoadImagesListener.noMorePages();
    } else {
        int newPage = mCurrentPage + 1;
        mLoadImagesListener.loadPage(newPage);
    }
}

Mit diesem Code wird, wenn das RecyclerView das letzte Element erreicht, die aktuelle Seite erhöht und über ein Interface Rückrufe ausgeführt, das dafür verantwortlich ist, weitere Daten aus der API zu laden und die neuen Ergebnisse dem Adapter hinzuzufügen.

Sollte das nicht klar sein, kann ich ein umfangreicheres Beispiel posten?

3voto

sergej shafarenka Punkte 19870

Ich würde versuchen, den verwendeten LayoutManager (z.B. LinearLayoutManager) zu erweitern und die Methode scrollVerticallyBy() zu überschreiben. Zuerst würde ich zuerst super aufrufen und dann den zurückgegebenen Integer-Wert überprüfen. Wenn der Wert gleich 0 ist, wurde eine untere oder obere Grenze erreicht. Dann würde ich die Methode findLastVisibleItemPosition() verwenden, um herauszufinden, welche Grenze erreicht ist und bei Bedarf mehr Daten laden. Nur eine Idee.

Zusätzlich können Sie sogar Ihren Wert aus dieser Methode zurückgeben, um Überschreiten und die Anzeige eines "Laden"-Indikators zu ermöglichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X