Recyclerview внутри прокрутки Nested Scrollview, но не выполняет быструю прокрутку, как обычный Recyclerview или Nested Scrollview


96

Пользуюсь RecyclerViewвнутри NestedScrollViewи работает. Но когда я использую RecyclerViewвнутри LinearLayoutили что-то еще, он прокручивается с разной скоростью в зависимости от жеста. Прокрутка слушает жест, и если я немного сдвигаюсь вверх, затем прокручивается немного, а если я скользлю очень быстро, прокручивается очень быстро. Теперь моя проблема в том, что RecyclerViewвнутри NestedScrollViewконечно прокрутка, но быстрая прокрутка не работает. Однако я скользлю вверх быстро или медленно, RecyclerViewили NestedScrollViewпрокручиваю только немного.

Как я могу заставить свой NestedScrollViewили RecyclerViewвнутренний вид прокрутки прокручивать с разной скоростью?


3
recyclerView.setNestedScrollingEnabled (ложь); Это действительно работает !!
Аунг Ши Мин Хтет,

stackoverflow.com/questions/27083091/… Решение можно найти здесь.
maruti060385 04

Пожалуйста, используйте open fun setNestedScrollingEnabled (enabled: Boolean): Unit Надеюсь, это поможет вам
Int0TheRainb0w

Ответы:


266

пытаться

recyclerView.setNestedScrollingEnabled(false);

14
Но при этом параметре recyclerview не перерабатывает представления! что ты об этом думаешь?
MAY3AM

На самом деле я добавляю два или более представлений ресайклера с разными менеджерами компоновки (такими как Linear Layout и Grid Layout) внутри своего макета, который также включает баннер и другие представления. Чтобы справиться с таким представлением ресайклера, поместив все это в исправление вложенного прокрутки для меня.
Аунг Ши Мин Хтет,

24
Я не знаю, как этот ответ получил столько голосов. Если отключить вложенную прокрутку, то это противоречит ее цели. Что, если я хочу использовать вложенные свитки и ресайклер ?? Что-то вроде CoordinatorLayout, AppBarLayout и RecyclerView ??
Джимит Патель,

Спасибо @JimitPatel, сейчас это как раз моя проблема. У меня есть recycleview в представлении nestedscroll, и я не могу прокручивать. stackoverflow.com/questions/41259756/…
Karoly

1
@Karoly нужно настроить вложенные свитки ... У меня это ... Я отправлю это через несколько часов ... В настоящее время я путешествую. Я столкнулся с этой проблемой в эффекте параллакса с представлением ресайклера после панели инструментов.
Jimit Patel

53

По умолчанию setNestedScrollingEnabledработает только после API-21.

Вы можете использовать ViewCompat.setNestedScrollingEnabled(recyclerView, false);для отключения вложенной прокрутки до и после API-21 (Lollipop). Ссылка на документацию .

Надеюсь на эту помощь!


22

Я работал над Android 16, где было невозможно использовать метод setNestedSCrollEnabled,

Что я делаю, чтобы не дать RecyclerView обрабатывать прокрутки.

Как и в LinerLayoutManager, я сделал canScrollHorizontally, canScrollVertical, чтобы по умолчанию возвращалось false.

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

            @Override
            public boolean canScrollVertically() {
                return false;
            }
        });

Это действительно сработало для меня. У меня был RecyclerView внутри LinearLinear внутри ScrollView.
FonzTech

9

После нескольких итераций я нашел решение.

  1. Если вы используете RecyclerView, то:

    recyclerView.setNestedScrollingEnabled(false);
  2. Если вы используете LinearLayout внутри NestedScrollingView, возьмите LinearLayout внутри обычного ScrollView и затем установите его прокрутку на

    scrollView.setNestedScrollingEnabled(false);

2

android: overScrollMode = "никогда

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

1

Вы можете использовать ScrollView с классом ExtendRecyclerView, который переопределяет метод onMeasure. Это подходит для меня!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);
}

1
recyclerView.setNestedScrollingEnabled(false);

Иногда будет полезно, но не всегда, потому что отключает функцию повторного просмотра в представлении утилизации.

Альтернативы:

Попробуйте CollapsiveToolbarLayout с представлением Recycler. поместите другие представления в макет collapsiveTollbar.


0

Я тоже столкнулся с этой проблемой. И обновите, чтобы 26.1.0исправить это.


-1

В моем случае я поместил все изображения в папку с возможностью рисования вместо папки drawable-xxxhdpi, поэтому пользовательский интерфейс моего экрана отстает.


-3

Вы должны обернуть представление ресайклера в любой макет, например LinearLayout, и установить размер RecyclerView на постоянный, например 800dp. Это обеспечит плавную прокрутку, и представление ресайклера по-прежнему будет повторять просмотры во время прокрутки.

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


1
Это хороший ответ, потому что он указывает способ устранения проблемы с прокруткой, не нарушая главного преимущества RecyclerView, загружая только видимые представления и повторно используя их, когда они прокручиваются вне поля зрения. Люди могли проголосовать против этого, потому что фиксированное значение, такое как 800dp, не будет работать для всех размеров и ориентации экрана, но значение layout_height можно вычислить и установить программно - немного беспорядочно, но оно решает обе проблемы.
jk7

-3

Это WAI. NestedScrollView измеряет своих дочерних элементов с помощью Spec «Unspecified». Ребенок тоже может расти сколько хочет.

По сути, это равняется высоте NSV и RV. Итак, что касается RV, он считает, что он полностью отображается.

Оберните свой дом на колесах LL и установите для него высоту. LL не установил бы для спецификации измерения значение UNSPECIFIED, поэтому RV будет правильно прокручивать в пределах установленной высоты любых DP, которые вы предоставляете.

Единственным недостатком этого метода является то, что вы не сможете найти родителя на своем автофургоне.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.