Jak wyłączyć przewijanie RecyclerView?

221

Nie mogę wyłączyć przewijania w RecyclerView. Próbowałem dzwonić, rv.setEnabled(false)ale nadal mogę przewijać.

Jak mogę wyłączyć przewijanie?

Zsolt Safrany
źródło
1
Po co używać, RecyclerViewjeśli nie chcesz przewijać?
CommonsWare
16
@CommonsWare, chcę na przykład tymczasowo je wyłączyć, podczas gdy ja wykonuję niestandardową animację z jednym z jej dzieci.
Zsolt Safrany
1
Ach, OK, to ma sens. Prawdopodobnie położyłbym przezroczystą Viewgórę RecyclerView, przełączając pomiędzy VISIBLEi GONEw razie potrzeby, ale poza mankietem twoje podejście wydaje się rozsądne.
CommonsWare
Mam nadzieję, że to pomoże znaleźć lepsze rozwiązanie.
Saiteja Parsi
1
@CommonsWare, oto na przykład to, czego potrzebuję. Muszę wyświetlać obrazy w RecyclerView pojedynczo, bez częściowo widocznych obrazów, tylko jeden w mojej rzutni. Po lewej i po prawej stronie znajdują się strzałki, którymi użytkownik może się poruszać. W zależności od tego, jaki obraz jest aktualnie wyświetlany (są różnych typów), niektóre elementy poza RecyclerView są wyzwalane. To jest projekt, którego oczekują nasi klienci.
Varvara Kalinina

Odpowiedzi:

368

W tym celu należy zastąpić menedżera układu w widoku kosza. W ten sposób wyłącza tylko przewijanie, bez żadnej innej funkcjonalności. Nadal będziesz w stanie obsługiwać zdarzenia kliknięcia lub inne zdarzenia dotykowe. Na przykład:-

Oryginalny:

 public class CustomGridLayoutManager extends LinearLayoutManager {
 private boolean isScrollEnabled = true;

 public CustomGridLayoutManager(Context context) {
  super(context);
 }

 public void setScrollEnabled(boolean flag) {
  this.isScrollEnabled = flag;
 }

 @Override
 public boolean canScrollVertically() {
  //Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll
  return isScrollEnabled && super.canScrollVertically();
 }
}

Za pomocą flagi „isScrollEnabled” możesz tymczasowo włączyć / wyłączyć funkcję przewijania w widoku kosza.

Również:

Wystarczy zastąpić istniejącą implementację, aby wyłączyć przewijanie i umożliwić klikanie.

 linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};
Saurabh Garg
źródło
2
To powinna być poprawna odpowiedź, ponieważ wyłącza przewijanie, jednocześnie pozwalając mi kliknąć.
Jared Burrows,
10
Wyłączenie przewijania domyślnego programu LayoutMangers powinno już istnieć, użytkownik interfejsu API nie powinien tego robić. Dzięki za odpowiedź!
Martin O'Shea
1
Co jeśli chcę wyłączyć przewijanie tylko od określonego elementu? Czyli możesz przewinąć w dół (lub w górę) do tego, ale potem zostać zablokowanym, dopóki nie włączę go ponownie?
programista Androida
2
To także wyłącza smoothScrollToPosition
Mladen Rakonjac
4
dodajesz obiekt w wersji kotlin: LinearLayoutManager (this) {override fun canScrollVertically (): Boolean {return false}}
amorenew
149

Prawdziwa odpowiedź brzmi

recyclerView.setNestedScrollingEnabled(false);

Więcej informacji w dokumentacji

Bozic Nebojsa
źródło
39
Spowoduje to wyłącznie przewijanie zagnieżdżone, a nie wszystkie przewijanie. W szczególności, jeśli RecyclerView znajduje się w ScrollView, ale nie wypełnia ekranu, ScrollView nie będzie przewijał (treść pasuje do ekranu), a interfejs użytkownika przewijania pojawi się w RecyclerView (efekt końca listy przy próbie przewijania, na przykład ), nawet jeśli nie będzie przewijać, gdy się powiększy. Rozszerzenie LayoutManager naprawdę spełnia swoje zadanie.
personne3000,
3
@ personne3000 Uważam, że do tego służy recyklerView.setHasFixedSize (true). Edycja: Używam tego również w połączeniu z setFillViewport (true), więc tak naprawdę nie jestem pewien, który z nich to naprawia.
mDroidd,
5
Działa to dla mnie dobrze, ale mój „RecyclerView” znajdował się w układzie fragmentów za pomocą „ScrollView”, więc musiałem zmienić „ScrollView” na „NestedScrollView”, jak opisano tutaj: stackoverflow.com/a/38088902/618464
educoutinho
1
Pamiętaj, aby używać pełnej nazwy klasy dla NestedScrollView: android.support.v4.widget.NestedScrollViewjak opisano tutaj, przez chessdork: stackoverflow.com/questions/37846245/…
gustavoknz
Po spędzeniu 4 godzin na ustaleniu, co jest nie tak, rozwiązałem mój problem. W moim przypadku korzystam z widoku recyclingu w MotionLayout. Dodałem tylko obszar przeciągania, aby przeciągnąć w górę, dodając ruch: touchAnchorId = "@ id / swipe_area". Działa normalnie, ale uruchamia się również po dotknięciu pustych obszarów recyklera. Zachowaj ostrożność podczas korzystania z motionLayout z innymi elementami przesuwanymi.
O. Kumru
73

PRAWDZIWA PRAWDZIWA odpowiedź brzmi: dla API 21 i wyższych:

Kod Java nie jest potrzebny. Możesz ustawić android:nestedScrollingEnabled="false" w xml:

<android.support.v7.widget.RecyclerView
     android:id="@+id/recycler"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:clipToPadding="true"
     android:nestedScrollingEnabled="false"
     tools:listitem="@layout/adapter_favorite_place">
Milad Faridnia
źródło
11
Myślę, że to powinna być zaakceptowana odpowiedź, bez wysiłku na zajęciach można wyłączyć przewijanie, a jednak dotyk jest dozwolony w układzie.
VipiN Negi
Co w przypadku interfejsów API poniżej 21?
Mouaad Abdelghafour AITALI
@pic dla niższych interfejsów API, których możesz użyć: recyclinglerView.setNestedScrollingEnabled (false);
Milad Faridnia
1
Zaakceptowana odpowiedź dla mnie.
Fernando Torres
1
jest to najlepsza i najprostsza odpowiedź, która pozwala również uniknąć niepotrzebnego zanieczyszczenia kodu i niekończących się wzorców rozszerzania klas.
Raphael C
52

Jest to nieco hackerskie obejście, ale działa; możesz włączyć / wyłączyć przewijanie w RecyclerView.

Jest to puste RecyclerView.OnItemTouchListenerkradnięcie każdego zdarzenia dotyku, co powoduje wyłączenie celu RecyclerView.

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return true;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

Użyj tego:

RecyclerView rv = ...
RecyclerView.OnItemTouchListener disabler = new RecyclerViewDisabler();

rv.addOnItemTouchListener(disabler);        // disables scolling
// do stuff while scrolling is disabled
rv.removeOnItemTouchListener(disabler);     // scrolling is enabled again 
Zsolt Safrany
źródło
8
Czy to również wyłącza klikanie elementu?
Jahir Fiquitiva
@JahirFiquitiva Tak. „To jest pusty RecyclerView.OnItemTouchListener kradnący każde zdarzenie dotykowe”
Max.
1
wyłącza to również przewijanie widoku rodzica
Jemshit Iskenderov
To także wyłącza kliknięcie przedmiotu
Muhammad Riyaz
1
Po co używać hackerskiego obejścia (z efektami ubocznymi), gdy istnieje czyste rozwiązanie? Wystarczy zastąpić menedżera układu (zobacz inne odpowiedzi)
personne3000,
37

To działa dla mnie:

  recyclerView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
          return true;
      }
  });
Alxgarcia
źródło
11
To wyłącza wszystkie dotknięcia.
Jared Burrows,
1
Niezła sztuczka! Aby ponownie włączyć, wystarczy ponownie ustawić onTouch onTouchListener, aby zwracał wartość false
HendraWD
uhm, ale jest ostrzeżenieCustom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
HendraWD,
Jeśli otrzymujesz to samo ostrzeżenie, o którym @HendraWD wspomniało w powyższym komentarzu, zapoznaj się z odpowiedziami na to pytanie: stackoverflow.com/questions/46135249/...
Nicolás Carrasco,
1
Zamiast zwracać wartość true i dlatego wyłączać wszelkiego rodzaju zdarzenia dotykowe, return e.getAction() == MotionEvent.ACTION_MOVE;zamiast tego return true;anulowane są tylko zdarzenia przewijania / machnięcia.
Toufic Batache
15

Możesz wyłączyć przewijanie, zamrażając RecyclerView.

Zamrażać: recyclerView.setLayoutFrozen(true)

Aby odmrozić: recyclerView.setLayoutFrozen(false)

Virat Singh
źródło
1
Uwaga: widoki podrzędne nie są aktualizowane, gdy RecyclerView jest zamrożony. Muszę wyłączyć przewijanie, gdy na ekranie jest wystarczająca ilość miejsca, aby wyświetlić wszystkie elementy. Och ... Cóż za fajny interfejs API Androida do tego zadania ...
Oleksandr nr
1
Przestarzałe w API 28
OhhhThatVarun
13

Utwórz klasę rozszerzającą klasę RecyclerView

public class NonScrollRecyclerView extends RecyclerView {

    public NonScrollRecyclerView(Context context) {
        super(context);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
}

Spowoduje to wyłączenie zdarzenia przewijania, ale nie zdarzenia kliknięcia

Użyj tego w swoim XML, wykonaj następujące czynności:

  <com.yourpackage.xyx.NonScrollRecyclerView 
     ...
     ... 
  />
Ashish
źródło
Dzięki! Wszystko to jest potrzebne, gdy chcemy, aby widok recyklera przyjął pełną wysokość zgodnie z zawartością bez wewnętrznego przewijania. :)
Rahul Rastogi
Ale jeśli ten widok programu do recyklingu znajduje się w przewijanym widoku (np. ScrollView), to menedżer układu powinien zastąpić metodę canScrollVertically () zwracając z niego wartość false.
Rahul Rastogi
@RahulRastogi używają NestedScrollView zamiast ScrollView
Ashish
Hej @AshishMangave, Powiedz, jak włączyć to ponownie programowo
Shruti
@Shruti nie możemy tego zrobić programowo. bcz bezpośrednio zastępujemy metodę onMeasure recyclinglerview. możesz wypróbować ten recyclinglerView.setNestedScrollingEnabled (false). to pomoże ci
Ashish
11

Jeśli po prostu wyłączyć tylko funkcjonalność przewijania z RecyclerViewczym można użyć setLayoutFrozen(true);metody RecyclerView. Ale nie można wyłączyć zdarzenia dotykowego.

your_recyclerView.setLayoutFrozen(true);
Ekta Bhawsar
źródło
ta metoda jest przestarzała. czy możesz zasugerować inny?
Aiyaz Parmar
Przestarzałe w API 28
OhhhThatVarun
9
recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // Stop only scrolling.
            return rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING;
        }
    });

rajesh
źródło
To przerywa przewijanie smoothScrollToPosition () po dotknięciu.
ypresto 18.04.16
Jest to dla mnie najlepsze rozwiązanie, ponieważ umożliwia programowe przewijanie, ale zapobiega przewijaniu przez użytkownika.
Miguel Sesma
7

Istnieje naprawdę prosta odpowiedź.

LinearLayoutManager lm = new LinearLayoutManager(getContext()) {
                @Override
                public boolean canScrollVertically() {
                    return false;
                }
            };

Powyższy kod wyłącza przewijanie w pionie RecyclerView.

Emi Raz
źródło
6

Napisałem wersję kotlin:

class NoScrollLinearLayoutManager(context: Context?) : LinearLayoutManager(context) {
    private var scrollable = true

    fun enableScrolling() {
        scrollable = true
    }

    fun disableScrolling() {
        scrollable = false
    }

    override fun canScrollVertically() =
            super.canScrollVertically() && scrollable


    override fun canScrollHorizontally() =
            super.canScrollVertically()

 && scrollable
}

stosowanie:

recyclerView.layoutManager = NoScrollLinearLayoutManager(context)
(recyclerView.layoutManager as NoScrollLinearLayoutManager).disableScrolling()
Jestem żabim smokiem
źródło
5

Rozwiń LayoutManageri zastąp canScrollHorizontally()i, canScrollVertically()aby wyłączyć przewijanie.

Pamiętaj, że wstawianie elementów na początku nie spowoduje automatycznego przewinięcia do początku, aby obejść ten problem, wykonaj następujące czynności:

  private void clampRecyclerViewScroll(final RecyclerView recyclerView)
  {
    recyclerView.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
    {
      @Override
      public void onItemRangeInserted(int positionStart, int itemCount)
      {
        super.onItemRangeInserted(positionStart, itemCount);
        // maintain scroll position at top
        if (positionStart == 0)
        {
          RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
          if (layoutManager instanceof GridLayoutManager)
          {
            ((GridLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }else if(layoutManager instanceof LinearLayoutManager)
          {
            ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }
        }
      }
    });
  }
Aidanvii
źródło
1
wyłącza to również smoothScrollToPosition
Mladen Rakonjac
5

Wiem, że ma to już zaakceptowaną odpowiedź, ale rozwiązanie nie uwzględnia przypadku, z którym się spotkałem.

W szczególności potrzebowałem elementu nagłówka, który nadal można było kliknąć, ale wyłączyłem mechanizm przewijania RecyclerView. Można to osiągnąć za pomocą następującego kodu:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                            @Override
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
         return e.getAction() == MotionEvent.ACTION_MOVE;
     }

     @Override
     public void onTouchEvent(RecyclerView rv, MotionEvent e) {

     }

     @Override
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});
Ryan Simon
źródło
Z jakiegoś powodu musisz kliknąć dokładnie, nie ruszając się, aby to zadziałało.
Jared Burrows,
Dobra uwaga, @JaredBurrows. Jest tak, ponieważ pomijamy ACTION_MOVE. Aby dotyk wydawał się naturalny, między dotykiem a delikatnym ruchem na ekranie jest trochę ustępowania. Niestety nie udało mi się rozwiązać tego problemu.
Ryan Simon
Dzięki, dokładnie to, czego potrzebowałem!
Student
5

Jak setLayoutFrozenjest przestarzałe, możesz wyłączyć przewijanie, zamrażając RecyclerView za pomocą suppressLayout.

Zamrażać:

recyclerView.suppressLayout(true)

Aby odmrozić:

recyclerView.suppressLayout(false)
Shylendra Madda
źródło
4

w XML: -

Możesz dodać

android:nestedScrollingEnabled="false"

w podrzędnym pliku XML układu RecyclerView

lub

w Javie: -

childRecyclerView.setNestedScrollingEnabled(false);

do RecyclerView w kodzie Java.

Za pomocą ViewCompat (Java): -

childRecyclerView.setNestedScrollingEnabled(false);będzie działać tylko na urządzeniach z Androidem> 21 . do pracy na wszystkich urządzeniach użyj następujących

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);

jafarbtech
źródło
Doskonałe, wszystkie api pokryte, powinny zostać włączone.
Ricard
3

Z jakiegoś powodu @Alejandro Gracia odpowiedź zaczyna działać dopiero po kilku sekundach. Znalazłem rozwiązanie, które natychmiast blokuje RecyclerView:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                return true;
            }
            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            }
            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            }
        });
vovahost
źródło
3

Zastąp onTouchEvent () i onInterceptTouchEvent () i zwróć false, jeśli w ogóle nie potrzebujesz OnItemTouchListener. To nie wyłącza OnClickListeners z ViewHolders.

public class ScrollDisabledRecyclerView extends RecyclerView {
    public ScrollDisabledRecyclerView(Context context) {
        super(context);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }
}
Ypresto
źródło
3

Możesz dodać ten wiersz po ustawieniu adaptera

ViewCompat.setNestedScrollingEnabled(recyclerView, false);

Teraz Twój recykler będzie działał z płynnym przewijaniem

Atefeh Srch
źródło
2

Walczę w tym numerze od kilku godzin, więc chciałbym podzielić się swoim doświadczeniem. W przypadku rozwiązania layoutManager jest w porządku, ale jeśli chcesz ponownie włączyć przewijanie, recykler wróci na górę.

Najlepszym jak dotąd rozwiązaniem (przynajmniej dla mnie) jest użycie metody @Zsolt Safrany, ale dodanie gettera i settera, abyś nie musiał usuwać ani dodawać OnItemTouchListener.

Następująco

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    boolean isEnable = true;

    public RecyclerViewDisabler(boolean isEnable) {
        this.isEnable = isEnable;
    }

    public boolean isEnable() {
        return isEnable;
    }

    public void setEnable(boolean enable) {
        isEnable = enable;
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return !isEnable;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {}

   @Override
   public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept){}
 }

Stosowanie

RecyclerViewDisabler disabler = new RecyclerViewDisabler(true);
feedsRecycler.addOnItemTouchListener(disabler);

// TO ENABLE/DISABLE JUST USE THIS
disabler.setEnable(enable);
Aladyn
źródło
2

W Kotlin, jeśli nie chcesz tworzyć dodatkowej klasy tylko dla ustawienia jednej wartości, możesz utworzyć anonimową klasę z LayoutManager:

recyclerView.layoutManager = object : LinearLayoutManager(context) {
    override fun canScrollVertically(): Boolean = false
}
Micer
źródło
1

Oto jak to zrobiłem z powiązaniem danych:

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipChildren="false"
                android:onTouch="@{(v,e) -> true}"/>

Zamiast „true” użyłem zmiennej boolowskiej, która zmieniła się w zależności od warunku, tak aby widok recyklera przełączał się między wyłączeniem i włączeniem.

biały
źródło
1

Przeszedłem z fragmentem zawierającym wiele RecycleView, więc potrzebuję tylko jednego paska przewijania zamiast jednego paska przewijania w każdym RecycleView.

Więc po prostu umieściłem ScrollView w kontenerze nadrzędnym, który zawiera 2 RecycleViews i używam go android:isScrollContainer="false"w RecycleView

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    android:isScrollContainer="false" />
pk028382
źródło
1

Dodaj

android:descendantFocusability="blocksDescendants"

w twoim dziecku SrollView lub NestedScrollView (i nadrzędnym ListView, recyclinglerview i gridview dowolny)

Pankaj Talaviya
źródło
1

Istnieje prostszy sposób wyłączenia przewijania (technicznie jest to raczej przechwytywanie zdarzenia przewijania i kończenie go, gdy spełniony jest warunek), przy użyciu tylko standardowej funkcjonalności. RecyclerViewma wywoływaną metodę addOnScrollListener(OnScrollListener listener), a właśnie za pomocą tego można zatrzymać przewijanie, tak więc:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (viewModel.isItemSelected) {
            recyclerView.stopScroll();
        }
    }
});

Przypadek użycia: powiedzmy, że chcesz wyłączyć przewijanie po kliknięciu jednego z elementów RecyclerView, abyś mógł z nim wykonać pewne czynności, bez rozpraszania się przypadkowym przewinięciem do innego elementu, a kiedy to zrobisz, po prostu kliknij element ponownie, aby umożliwić przewijanie. W tym celu chcesz dołączyć OnClickListenerdo każdego elementu w środku RecyclerView, więc po kliknięciu elementu zmieni się isItemSelectedz falsena true. W ten sposób, gdy spróbujesz przewijać, RecyclerViewautomatycznie wywoła metodę, onScrollStateChangeda ponieważ isItemSelectedustawione na true, zatrzyma się natychmiast, zanim pojawi RecyclerViewsię szansa, no cóż ... przewinąć.

Uwaga: dla lepszej użyteczności spróbuj użyć GestureListenerzamiast OnClickListenerzapobiegać accidentalkliknięciom.

Tim Jorjev
źródło
stopScroll()to nie zamrożenie zwoju, to po prostu zatrzymanie / zatrzymanie przewijania.
Farid
@ FARID, tak, ta metoda po prostu zatrzymuje przewijanie w toku, aw tym konkretnym przypadku robi to za każdym razem, gdy użytkownik próbuje przewijać zawartość RecyclerView z isItemSelectedustawionym na true. W przeciwnym razie potrzebujesz niestandardowego RecyclerView, aby na stałe wyłączyć przewijanie i chciałem tego uniknąć, ponieważ potrzebowałem tylko trochę dodatkowej funkcjonalności, jaką zapewnia to rozwiązanie.
Tim Jorjev
0

Po prostu dodaj to do swojego widoku w formacie xml

 android:nestedScrollingEnabled="false"

lubię to

<android.support.v7.widget.RecyclerView
                    android:background="#ffffff"
                    android:id="@+id/myrecycle"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:nestedScrollingEnabled="false">
anas
źródło
0

Aby zatrzymać przewijanie dotykowe, ale przewijaj za pomocą poleceń:

if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);

        appTopBarMessagesRV.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

                if ( rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING)
                {
                     // Stop  scrolling by touch

                    return false;
                }
                return  true;
            }
        });
    }
Chłopak
źródło