Derzeit verwende ich den folgenden Code, um zu überprüfen, ob SwipeRefreshLayout aktiviert werden soll.
private void laySwipeToggle() {
if (mRecyclerView.getChildCount() == 0 || mRecyclerView.getChildAt(0).getTop() == 0) {
mLaySwipe.setEnabled(true);
} else {
mLaySwipe.setEnabled(false);
}
}
Aber hier ist das Problem. Wenn es zur Ansichtsgrenze eines anderen Elements gescrollt wird, wird mRecyclerView.getChildAt(0).getTop()
ebenfalls 0 zurückgegeben.
Gibt es so etwas wie RecyclerView.isScrolledToBottom()
oder RecyclerView.isScrolledToTop()
?
EDIT: (mRecyclerView.getChildAt(0).getTop() == 0 && linearLayoutManager.findFirstVisibleItemPosition() == 0)
Art macht das RecyclerView.isScrolledToTop()
, aber was ist mit RecyclerView.isScrolledToBottom()
?
android
android-recyclerview
Saren Arterius
quelle
quelle
Antworten:
Die Lösung befindet sich 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
Wenn Ihre Artikelgröße größer als der Bildschirm ist, verwenden Sie Folgendes, um das Hauptereignis zu erkennen.
RecyclerView recyclerView = (RecyclerView) view; LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int pos = linearLayoutManager.findFirstVisibleItemPosition(); if(linearLayoutManager.findViewByPosition(pos).getTop()==0 && pos==0){ return true; }
PS: Wenn Sie das
RecyclerView
direkt in das platzieren, müssenSwipeRefreshview
Sie dies nicht tunquelle
first/lastCompletelyVisibleItemPosition()
-1 zurückgegeben wird, bedeutet dies, dass überhaupt kein vollständig sichtbares Element vorhanden ist.lastVisibleItemPosition
undlastCompletelyVisibleItemPosition
funktioniert nicht. (Methode kann nicht aufgelöst werden). Hilfe?findLastCompletelyVisibleItemPosition
wird fehlschlagen, wenn die Höhe des letzten Elements größer als die Bildschirmhöhe ist. Dies bedeutet, dass das letzte Element sichtbar, aber nicht vollständig sichtbar istlayout.findLastCompletelyVisibleItemPosition()=-1(RecyclerView.NO_POSITION)
. Die VerwendunglastVisibleItemPosition
und Überprüfung des unteren Randes der letzten Ansicht im Layout ist sicherer.Sie können versuchen
recyclerView.canScrollVertically(int direction)
, ob Sie nur wissen müssen, ob ein Bildlauf möglich ist oder nicht.Richtungszahlen:
quelle
onScrollStateChanged
Arbeiten für mich.Um zu überprüfen, ob
RecyclerView
nach unten gescrollt wird. 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 implementieren möchten
ScrollToBottom
inRecyclerView
wannEdittext
isttapped
dann empfehle ich Ihnen hinzufügen 1 Sekunde Verzögerung wie folgt aus :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; } });
quelle
@Saren Arterius, Mit dem addOnScrollListener von RecycleView können Sie den Bildlauf oben oder unten in Vertical RecycleView wie unten finden.
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... } } });
quelle
Verwenden Sie recyclerView.canScrollVertically (int-Richtung) , um zu überprüfen, ob der obere oder untere Rand des Bildlaufs erreicht ist.
Richtung = 1 für Bildlauf nach unten (unten)
Richtung = -1 für Bildlauf nach oben (oben)
Wenn die Methode false zurückgibt, bedeutet dies, dass Sie entweder oben oder unten erreicht haben. Dies hängt von der Richtung ab.
quelle
Behalten Sie einfach einen Verweis auf Ihren layoutManager 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; } } } });
quelle
setOnScrollListner
ist jetzt veraltet.addOnScrollListener
weil, wie @shajeelAfzal sagte,setOnScrollListener
jetzt veraltet ist, sollten Sie verwenden,addOnScrollListener
weil, wie @shajeelAfzal sagte,setOnScrollListener
jetzt veraltet ist, überprüfen Sie hierpreviousTotal
?Sie können oben anhand der folgenden Informationen erkennen
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 erkennt oben, wenn Sie den Finger loslassen, sobald er oben erreicht ist. Wenn Sie erkennen möchten, sobald die Reacyclerview die Top-Check-
if(IsRecyclerViewAtTop())
Inside-onScrolled
Methode erreichtquelle
getChildAt()
Gibt das erste untergeordneteViewGroup
Element von zurück, das sich vom ersten Element der Liste unterscheiden kann (und wird). Wenn dieses untergeordnete Element perfekt am oberen Rand der Recycling-Ansicht ausgerichtet ist, gibt IhreIsRecyclerViewAtTop()
Methode true zurück, auch wenn sie sich nicht oben befindet.Ich habe einen RecyclerViewHelper geschrieben, um zu wissen, dass sich der Recyclerview oben oder unten befindet.
public class RecyclerViewHelper { public static boolean isAtTop(RecyclerView recyclerView) { if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return isAtTopBeforeIceCream(recyclerView); } else { return !ViewCompat.canScrollVertically(recyclerView, -1); } } private static boolean isAtTopBeforeIceCream(RecyclerView recyclerView) { RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager) { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; int pos = linearLayoutManager.findFirstVisibleItemPosition(); if (linearLayoutManager.findViewByPosition(pos).getTop() == recyclerView.getPaddingTop() && pos == 0) return true; } return false; } public static boolean isAtBottom(RecyclerView recyclerView) { if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return isAtBottomBeforeIceCream(recyclerView); } else { return !ViewCompat.canScrollVertically(recyclerView, 1); } } private static boolean isAtBottomBeforeIceCream(RecyclerView recyclerView) { RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int count = recyclerView.getAdapter().getItemCount(); if (layoutManager instanceof LinearLayoutManager) { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; int pos = linearLayoutManager.findLastVisibleItemPosition(); int lastChildBottom = linearLayoutManager.findViewByPosition(pos).getBottom(); if (lastChildBottom == recyclerView.getHeight() - recyclerView.getPaddingBottom() && pos == count - 1) return true; } return false; }
}}
quelle
Sie können dies tun, es ist Arbeit für mich
mRecycleView.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); int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); LinearLayoutManager linearLayoutManager1 = (LinearLayoutManager) recyclerView.getLayoutManager(); int firstVisibleItem = linearLayoutManager1.findFirstVisibleItemPosition(); swipeRefreshLayout.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0); } });
quelle
Um herauszufinden, ob die RecyclerView nach unten gescrollt ist, können Sie die für die Bildlaufleiste verwendeten Methoden wiederverwenden.
Dies ist die Berechnung, die der Einfachheit halber als Kotlin-Erweiterungsfunktion geschrieben wurde:
fun RecyclerView.isScrolledToBottom(): Boolean { val contentHeight = height - (paddingTop + paddingBottom) return computeVerticalScrollRange() == computeVerticalScrollOffset() + contentHeight }
quelle
fun RecyclerView.isScrolledToBottom(margin: Int = 1): Boolean { val contentHeight = height - (paddingTop + paddingBottom) return computeVerticalScrollRange() - computeVerticalScrollOffset() - contentHeight >= margin }
fun RecyclerView.isScrolledToBottom(margin: Int = 1): Boolean { val contentHeight = height - (paddingTop + paddingBottom) return computeVerticalScrollRange() - computeVerticalScrollOffset() - contentHeight <= margin }
Sie können es mit dem OnTouchListener versuchen:
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { if (e.getAction() == MotionEvent.ACTION_UP || e.getAction() == MotionEvent.ACTION_MOVE){ if (mLinearLayoutManager.findFirstCompletelyVisibleItemPosition() > 0) { // beginning of the recycler } if (mLinearLayoutManager.findLastCompletelyVisibleItemPosition()+1 < recyclerView.getAdapter().getItemCount()) { // end of the recycler } } return false; }
quelle