Aber hier ist das Problem. Wenn es zur Grenze der Ansicht eines anderen Elements gescrollt wird mRecyclerView.getChildAt(0).getTop() gibt auch 0 zurück.
Gibt es sowas RecyclerView.isScrolledToBottom() oder RecyclerView.isScrolledToTop()?
BEARBEITEN: (mRecyclerView.getChildAt(0).getTop() == 0 && linearLayoutManager.findFirstVisibleItemPosition() == 0) Art tut das RecyclerView.isScrolledToTop()aber was ist mit RecyclerView.isScrolledToBottom()?
Ich nehme an, letzteres kann erreicht werden, indem die Unterseite der Recyclerview mit dem letzten Kind verglichen wird, dh etwas in der Art von mRecyclerView.getBottom()== linearLayoutmanager.findViewbyPosition(adapter.getItemCount() – 1).getBottom()
– bescheidener Anfänger
24. August 2015 um 13:27 Uhr
@ Saren Arterius, vielleicht möchten Sie sich das ansehen
– Sheraz Ahmad Khilji
4. November 2015 um 7:05 Uhr
bescheidener Anfänger
Die Lösung liegt im Layout-Manager.
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// Add this to your Recycler view
recyclerView.setLayoutManager(layoutManager);
// To check if at the top of recycler view
if(layoutManager.firstCompletelyVisibleItemPosition()==0){
// Its at top
}
// To check if at the bottom of recycler view
if(layoutManager.lastCompletelyVisibleItemPosition()==data.size()-1){
// Its at bottom
}
BEARBEITEN
Falls Ihre Artikelgröße größer als der Bildschirm ist, verwenden Sie Folgendes, um das Top-Ereignis zu erkennen.
PS: Eigentlich, wenn du das platzierst RecyclerView direkt in der SwipeRefreshview Sie müssten dies nicht tun
Nein, es passiert immer noch, wenn RecyclerView das direkte untergeordnete Element von SwipeRefreshLayout ist. Das Überprüfen der firstCompletelyVisibleItemPosition behebt das Problem jedoch. Ich muss hier auf etwas hinweisen. Wenn keines der Elemente vollständig sichtbar ist, gibt firstCompletelyVisibleItemPosition() -1 zurück. Diese Lösung funktioniert also nicht, wenn das erste Element nicht in die RecyclerView passt, wenn es nach oben gescrollt wird. Aber es ist eine sehr seltene Situation.
– eluleci
31. März 2015 um 10:43 Uhr
@eluleci : Prüfen, ob Liste oben ist RecyclerView rc=(RecyclerView)view; LinearLayoutManager lm= (LinearLayoutManager) rc.getLayoutManager(); if(lm.findViewByPosition(lm.findFirstVisibleItemPosition()).getTop()==0 && lm.findFirstVisibleItemPosition()==0) return true; //Dies würde sogar funktionieren, wenn das Element größer als der Bildschirm ist
– bescheidener Anfänger
27. April 2015 um 10:03 Uhr
Dies würde fehlschlagen, wenn das Element (erstes oder letztes) größer als der gesamte Bildschirm ist. Da, first/lastCompletelyVisibleItemPosition() gibt -1 zurück, impliziert, dass es überhaupt kein vollständig sichtbares Element gibt.
– C–
20. August 2015 um 10:49 Uhr
Beide lastVisibleItemPosition und lastCompletelyVisibleItemPosition funktionieren nicht. (Methode kann nicht aufgelöst werden). Hilfe?
– Sternenstaub
7. Juli 2016 um 22:49 Uhr
findLastCompletelyVisibleItemPosition schlägt fehl, wenn die Höhe des letzten Elements größer als die Bildschirmhöhe ist. Das bedeutet, dass das letzte Element zwar sichtbar, aber nicht vollständig sichtbar ist layout.findLastCompletelyVisibleItemPosition()=-1(RecyclerView.NO_POSITION). Verwenden lastVisibleItemPosition und prüfen Sie, ob der untere Rand der letzten Ansicht im Layout sicherer ist.
– Weg
29. August 2016 um 5:50 Uhr
Penzz
Du kannst es versuchen recyclerView.canScrollVertically(int direction)wenn Sie nur wissen müssen, ob es möglich ist, zu scrollen oder nicht.
Richtungs-Ganzzahlen:
-1 für nach oben
1 für unten
0 gibt immer falsch zurück.
Dies müsste jedoch in einem Intervall wiederholt werden, oder?
– Sternenstaub
7. Juli 2016 um 22:52 Uhr
Sie können dies in recyclerView.addOnScrollListener herausfinden … es funktioniert wie ein Zauber … danke
– theralrashant
12. September 2016 um 18:34 Uhr
Groß! Dies gibt ein falsches zurück, wenn wir das Ende des Scrollens erreichen, ich brauchte dieses Ereignis.
– Kasten
25. November 2016 um 14:40 Uhr
Exzellent. Verwenden Sie dies in onScrollStateChanged funktioniert bei mir.
– Lym Zoy
6. Februar 2017 um 15:49 Uhr
Richtungs-Integer: -1 für aufwärts, 1 für abwärts, 0 gibt immer falsch zurück.
– Grux
4. September 2017 um 2:34 Uhr
Sheraz Ahmad Khilji
Um zu prüfen, ob RecyclerView wird nach unten gescrollt. Verwenden Sie den folgenden Code.
/**
* Check whether the last item in RecyclerView is being displayed or not
*
* @param recyclerView which you would like to check
* @return true if last position was Visible and false Otherwise
*/
private boolean isLastItemDisplaying(RecyclerView recyclerView) {
if (recyclerView.getAdapter().getItemCount() != 0) {
int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
return true;
}
return false;
}
Einige zusätzliche Informationen
Wenn Sie umsetzen möchten ScrollToBottom in RecyclerView Wenn Edittext ist tapped dann empfehle ich Ihnen hinzufügen 1 Sekunde Verzögerung so was:
edittext.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP)
if (isLastItemDisplaying(recyclerView)) {
// The scrolling can happen instantly before keyboard even opens up so to handle that we add 1 second delay to scrolling
recyclerView.postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1);
}
}, 1000);
}
return false;
}
});
Hat für mich funktioniert. Ich musste es zu RecyclerView hinzufügen addOnScrollListener() obwohl
– Aphoe
29. Mai 2016 um 1:13 Uhr
Dies funktioniert nicht für den trivialen Fall, in dem sich ein Element in der Recycleransicht befindet und es vollständig sichtbar ist.
– Techniktüftler
22. Oktober 2016 um 2:07 Uhr
Du hast einen Tag gespart
– Reena
8. Februar 2017 um 7:25 Uhr
@ Saren Arterius, Verwenden der addOnScrollListener von RecycleViewfinden Sie das Scrollen oben oder unten in Vertical RecycleView wie unten,
RecyclerView rv = (RecyclerView)findViewById(R.id.rv);
rv.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) {
if (dy < 0) {
// Recycle view scrolling up...
} else if (dy > 0) {
// Recycle view scrolling down...
}
}
});
Verwenden recyclerView.canScrollVertical(int direction) um zu prüfen, ob das obere oder untere Ende der Schriftrolle erreicht ist.
direction = 1 für nach unten scrollen (unten)
direction = -1 für nach oben scrollen (oben)
Wenn die Methode false zurückgibt, bedeutet dies, dass Sie entweder oben oder unten angekommen sind, abhängig von der Richtung.
Xieyi
Behalten Sie einfach einen Verweis auf Ihren LayoutManager bei und setzen Sie onScrollListener in Ihrer Recycler-Ansicht wie folgt
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = mRecyclerView.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItemIndex = mLayoutManager.findFirstVisibleItemPosition();
//synchronizew loading state when item count changes
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading)
if ((totalItemCount - visibleItemCount) <= firstVisibleItemIndex) {
// Loading NOT in progress and end of list has been reached
// also triggered if not enough items to fill the screen
// if you start loading
loading = true;
} else if (firstVisibleItemIndex == 0){
// top of list reached
// if you start loading
loading = true;
}
}
}
});
Sie können oben erkennen, indem Sie Folgendes verwenden
recyclerView.addOnScrollListener(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) {
super.onScrollStateChanged(recyclerView, newState);
if(isRecyclerViewAtTop())
{
//your recycler view reached Top do some thing
}
}
});
private boolean isRecyclerViewAtTop() {
if(recyclerView.getChildCount() == 0)
return true;
return recyclerView.getChildAt(0).getTop() == 0;
}
Dies wird oben erkennen, wenn Sie den Finger loslassen, sobald Sie oben angekommen sind, wenn Sie erkennen möchten, sobald der Recyclerview oben angekommen ist if(isRecyclerViewAtTop()) Innerhalb onScrolled Methode
Das scheint falsch zu sein. getChildAt() gibt das erste Kind der zurück ViewGroup, die sich vom ersten Element der Liste unterscheiden könnte (und wird). Wenn dieses Kind perfekt mit der Oberseite der Recycleransicht ausgerichtet ist, ist Ihr IsRecyclerViewAtTop() -Methode gibt true zurück, obwohl sie nicht ganz oben steht.
– aspykt
29. Mai 2017 um 9:23 Uhr
13007400cookie-checkWoher wissen, ob ein RecyclerView / LinearLayoutManager nach oben oder unten gescrollt wird?yes
Ich nehme an, letzteres kann erreicht werden, indem die Unterseite der Recyclerview mit dem letzten Kind verglichen wird, dh etwas in der Art von mRecyclerView.getBottom()== linearLayoutmanager.findViewbyPosition(adapter.getItemCount() – 1).getBottom()
– bescheidener Anfänger
24. August 2015 um 13:27 Uhr
@ Saren Arterius, vielleicht möchten Sie sich das ansehen
– Sheraz Ahmad Khilji
4. November 2015 um 7:05 Uhr