Recyclerview wewnątrz zagnieżdżonego przewijania Scrollview, ale nie przewija się tak szybko, jak zwykły widok z recyklingu lub zagnieżdżony widok przewijania

96

Używam RecyclerViewwewnątrz NestedScrollViewi działa. Ale kiedy używam RecyclerViewśrodka LinearLayoutlub czegoś, przewija się z różną prędkością w zależności od gestu. Zwój nasłuchuje gestów i jeśli przesuwam się tylko trochę, to przewija się trochę, a jeśli przesuwam się bardzo szybko, to przewija się naprawdę szybko. Teraz mój problem polega na tym, że RecyclerViewwewnątrz z NestedScrollViewpewnością przewijanie, ale szybkie przewijanie nie działa. Jednak przesuwam się szybko lub wolno RecyclerViewlub NestedScrollViewtylko trochę przewijam.

Jak mogę przewijać widok przewijania NestedScrollViewlub RecyclerViewwewnątrz tego widoku z różną prędkością?

Aung Si Min Htet
źródło
3
recyklerView.setNestedScrollingEnabled (false); To naprawdę działa !!
Aung Si Min Htet
stackoverflow.com/questions/27083091/… Rozwiązanie można znaleźć tutaj.
maruti060385
Użyj otwartego zestawu zabawNestedScrollingEnabled (włączone: Boolean): Jednostka Mam nadzieję, że ci to pomoże
Int0TheRainb0w

Odpowiedzi:

266

próbować

recyclerView.setNestedScrollingEnabled(false);
Yang Peiyong
źródło
14
Ale przy tym ustawieniu recykling nie odtwarza widoków! co o tym myślisz
MAJ
Właściwie dodaję dwa lub więcej widoków recyklera z różnymi menedżerami układu (takimi jak układ liniowy i układ siatki) w moim układzie, który obejmuje również baner i inne widoki. Tak więc, aby poradzić sobie z widokiem recyklera, umieszczając je wszystkie w poprawce Nested Scroll View.
Aung Si Min Htet
24
Nie wiem, jakim cudem ta odpowiedź zebrała tyle pozytywnych głosów. Wyłączenie zagnieżdżonego przewijania jest sprzeczne z jego celem. A jeśli chcę używać zagnieżdżonych zwojów i recyklera? Coś w stylu CoordinatorLayout, AppBarLayout i RecyclerView?
Jimit Patel
Dzięki @JimitPatel, to jest dokładnie mój problem w tej chwili. Mam widok recyklingu w widoku zagnieżdżonego przewijania i nie mogę przewijać.stackoverflow.com/questions/41259756/…
Karoly
1
@Karoly muszę dostosować zagnieżdżone zwoje ... Mam to ... Opublikuję to za kilka godzin ... Obecnie podróżuję. Zmierzyłem się z tym problemem w efekcie paralaksy z widokiem recyklera za paskiem narzędzi.
Jimit Patel,
53

Domyślnie setNestedScrollingEnableddziała tylko po API-21.

Możesz użyć, ViewCompat.setNestedScrollingEnabled(recyclerView, false);aby wyłączyć zagnieżdżone przewijanie przed i po API-21 (Lollipop). Link do dokumentacji .

Mam nadzieję, że to pomoże!

Hemant Kaushik
źródło
21

Pracowałem na Androidzie 16, gdzie nie można było użyć metody setNestedSCrollEnabled,

Co ostatecznie robię, aby uniemożliwić RecyclerView obsługę Scrolls.

Podobnie jak w LinerLayoutManager, utworzyłem canScrollHorizontally, canScrollVertically domyślnie zwraca wartość false.

myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false){
            @Override
            public boolean canScrollHorizontally() {
                return false;
            }

            @Override
            public boolean canScrollVertically() {
                return false;
            }
        });
Zain Ali
źródło
To faktycznie zadziałało dla mnie. Miałem RecyclerView, wewnątrz LinearLinear, wewnątrz ScrollView.
FonzTech
9

Po kilku iteracjach znalazłem rozwiązanie.

  1. Jeśli używasz RecyclerView, to:

    recyclerView.setNestedScrollingEnabled(false);
    
  2. Jeśli używasz LinearLayout wewnątrz NestedScrollingView, weź LinearLayout do normalnego ScrollView, a następnie ustaw jego przewijanie na

    scrollView.setNestedScrollingEnabled(false);
    
Sarthak Gandhi
źródło
2

android: overScrollMode = "nigdy

  <android.support.v4.widget.NestedScrollView
    android:id="@+id/nestedScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
 </android.support.v4.widget.NestedScrollView>
Maryam Azhdari
źródło
1

Możesz użyć ScrollView z klasą ExtendRecyclerView, która przesłania metodę onMeasure. To działa dla mnie!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);
}
Quý Nguyễn Nam
źródło
1
recyclerView.setNestedScrollingEnabled(false);

Przyda się czasami, ale nie zawsze jest to zalecane, ponieważ wyłącza funkcję przeglądania recyklingu w widoku recylcera.

Alternatywy:

Wypróbuj CollapsiveToolbarLayout z widokiem Recycler. umieszczaj inne widoki w układzie zwijanego paska narzędzi.

Rajesh.k
źródło
0

Ja też spotkałem się z tym problemem. I zaktualizuj, aby 26.1.0to naprawić.

linkaipeng
źródło
-1

W moim przypadku umieściłem wszystkie obrazy w folderze do rysowania zamiast folderu drawable-xxxhdpi, dlatego mój interfejs użytkownika ekranu jest opóźniony.

Mayuresh Deshmukh
źródło
-3

Powinieneś opakować widok recyklera w dowolny układ, taki jak LinearLayout i ustawić rozmiar RecyclerView na stałą, na przykład 800dp. Umożliwi to płynne przewijanie, a widok recyklera będzie nadal wyświetlać widoki recyklera podczas przewijania.

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                                xmlns:app="http://schemas.android.com/apk/res-auto"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="800dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</LinearLayout>

Thror
źródło
1
Jest to dobra odpowiedź, ponieważ wskazuje sposób na naprawienie problemu z przewijaniem bez przerywania głównej korzyści RecyclerView, wczytywania tylko widocznych widoków i ponownego ich przetwarzania, gdy są przewijane poza zasięgiem wzroku. Ludzie mogli głosować w dół, ponieważ stała wartość, taka jak 800 dp, nie będzie działać na wszystkich rozmiarach i orientacjach ekranu, ale wartość layout_height można obliczyć i ustawić programowo - trochę bałagan, ale rozwiązuje oba problemy.
jk7
-3

To jest WAI. NestedScrollView mierzy swoje elementy podrzędne przy użyciu specyfikacji „nieokreślonej”. Dziecko też może rosnąć tak bardzo, jak chce.

To zasadniczo zrównuje wysokość NSV i RV. Jeśli chodzi o kamper, uważa, że ​​jest on całkowicie pokazany.

Owiń RV LL i nadaj RV wysokość. LL nie ustawiłby specyfikacji miary jako NIEOKREŚLONE, więc RV prawidłowo przewijałby się w ustawionej wysokości niezależnie od podanych DP.

Jedyną wadą tej metody jest to, że nie będziesz w stanie dopasować rodzica w swoim kamperze.

Muhammad Ahmed AbuTalib
źródło