2016-05-18 5 views
64

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

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

+0

Да, это проблема –

+1

recyclerView.setNestedScrollingEnabled (false); Это действительно работает !! –

+0

https://stackoverflow.com/questions/27083091/recyclerview-inside-scrollview-is-not-working/45466603#45466603 Решение можно найти здесь. – maruti060385

ответ

195

попробовать

recyclerView.setNestedScrollingEnabled(false); 
+8

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

+0

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

+0

Спасло меня много времени, спасибо за обмен! – wax911

-5

Вы должны обернуть вид ресайклера в любом макете, как 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> 

+0

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

12

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

То, что я в конечном итоге делает, чтобы остановить RecyclerView от обработки Scrolls.

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

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

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

awesome, спасибо! –

+0

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

24

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

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

Надеюсь, что эта помощь!

+2

Это должен быть принятый ответ! благодаря –

-1

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

Это, по существу, означает высоту NSV и RV. Что касается RV, то он считает, что он полностью отображается.

Оберните свой RV LL и дайте RV высоту. LL не установил бы, чтобы спецификация измерения была НЕ ОПРЕДЕЛЕНА, чтобы RV правильно прокручивал в пределах своей установленной высоты любых DP, которые вы предоставляете.

Единственным недостатком этого метода является то, что вы не сможете сделать родительский знак соответствия на вашем RV.

1

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

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

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

    scrollView.setNestedScrollingEnabled(false); 
    
0

Вы можете использовать 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); 
} 
0
recyclerView.setNestedScrollingEnabled(false); 

Будет полезен sometimes.But не рекомендуется для всех times.because отключает функцию просмотра рециркуляции ввиду recylcer.

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

Try CollapsiveToolbarLayout с видом на Recycler. положить другие виды в collapsiveTollbar макет.

Смежные вопросы