Wie kann ich wissen, ob ein RecyclerView / LinearLayoutManager nach oben oder unten gescrollt wird?

Zurzeit verwende ich den folgenden Code, um zu prü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 auf die Grenze des anderen Elements mRecyclerView.getChildAt(0).getTop() auch 0 zurück.

  • Ist es möglich, während der Anrufe Musik zu spielen, damit der Partner es hören kann? Android
  • ACTION_SCREEN_ON und ACTION_SCREEN_OFF funktioniert nicht?
  • Kann nicht auflösen Methode 'show (android.support.v4.app.FragmentManager, java.lang.String)
  • Verwenden von AsyncTask
  • Android Test Code Abdeckung mit JaCoCo Gradle Plugin
  • Android CalendarView Klasse kann nicht gefunden werden
  • Das Problem

    Gibt es so etwas wie RecyclerView.isScrolledToBottom() oder RecyclerView.isScrolledToTop() ?

    EDIT: (mRecyclerView.getChildAt(0).getTop() == 0 && linearLayoutManager.findFirstVisibleItemPosition() == 0) Art von tut das RecyclerView.isScrolledToTop() , aber was ist mit RecyclerView.isScrolledToBottom() ?

  • Null-Zeiger nach der Aufnahme von Bild mit Android-Kamera in nexus 5
  • So legen Sie Priorität von IntentService in Android fest
  • Unterschied zwischen MICRO_KIND und MINI_KIND in mediastore in android?
  • Wie man Android ActionBar anpasst, um eine benutzerdefinierte Ansicht vor den Tabs anzuzeigen?
  • Wo soll ich Fehler in der Android-Dokumentation melden?
  • Kontinuierliche Spracherkennung Android
  • 9 Solutions collect form web for “Wie kann ich wissen, ob ein RecyclerView / LinearLayoutManager nach oben oder unten gescrollt wird?”

    Die Lösung befindet sich im Layout-Manager.

     LinearLayoutManager layoutManager=new LinearLayoutManager(this); //Add this to your Recyclerview recyclerview.setLayoutManager(layoutManager); //Tocheck if recycler is on top if(layoutManager.firstCompletelyVisibleItemPosition()==0){ //Its at top .. } //Tocheck if recycler is on bottom if(layoutManager.lastCompletelyVisibleItemPosition()==data.size()-1){ //Its at bottom .. } 

    EDIT Wenn Ihre Artikelgröße größer als der Bildschirm ist, verwenden Sie die folgenden, um das obere Ereignis zu erkennen.

     RecyclerView rc=(RecyclerView)view; LinearLayoutManager lm= (LinearLayoutManager) rc.getLayoutManager(); int pos = lm.findFirstVisibleItemPosition(); if(lm.findViewByPosition(pos).getTop()==0 && pos==0) return true; 

    PS: Eigentlich, wenn du die RecyclerView direkt in die SwipeRefreshview platzierst, musst du das nicht machen

    Sie können versuchen, recyclerView.canScrollVertically(int direction) , wenn Sie nur wissen müssen, ob es möglich ist zu scrollen oder nicht

    Um zu überprüfen, ob RecyclerView nach unten RecyclerView 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 du ScrollToBottom in RecyclerView implementieren ScrollToBottom wenn Edittext tapped wird, empfehle ich dir, 1 Sekunde Verzögerung wie Edittext hinzuzufügen:

      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; } }); 

    @Saren Arterius, Mit dem addOnScrollListener von RecycleView finden Sie das Scrolling oben oder unten von 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... } } }); 

    Halten Sie einfach einen Verweis auf Ihren layoutManager und setzen Sie onScrollListener auf Ihre Recycler-Ansicht so

     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; } } } }); 

    Du kannst das 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); } }); 

    Du kannst 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; } 

    Ich habe einen RecyclerViewHelper geschrieben, um zu wissen, dass das recyclerview oben oder unten ist.

     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; } 

    }

    Sie können oben erkennen, indem Sie die folgenden 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 erkennt die Oberseite, wenn du den Finger einmal nach oben bekommst, wenn du es feststellen möchtest, sobald das reacyclerview die obere Kontrolle erreicht, if(IsRecyclerViewAtTop()) innerhalb der onScrolled Methode

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.