2016-05-23 13 views
17

Mam układ tak:NestedScrollView nie rzucać z Recyclerview wewnątrz

<NestedScrollView> 
    <RecyclerView> // vertical recycler view 
      <RecyclerView/> // horizontal recycler view 
      <RecyclerView/> 
      <RecyclerView/> 
      ... 
    <RecyclerView> 
</NestedScrollView> 

Wynik wygląda Google Play Store: enter image description here

I wyłączone NestedScrolling w horizontal Recycler widzenia:

horizontalRecyclerView.setHasFixedSize(true); 
horizontalRecyclerView.setNestedScrollingEnabled(false); 

Mój problem:

The vertical recyclerview nie przewija fling, gdy tylko stanie się ACTION_UP, zatrzyma również przewijanie vertical recyclerview.

Jak zagnieżdżać vertical recyclerview wewnątrz nestedscrollview i horizontal recyclerview wewnątrz vertical recyclerview jak Playstore i zachować płynność przewijania.

rozwiązany:

Korzystanie zwyczaj zagnieżdżony widok przewijania @vrund Purohit (kod poniżej) i wyłączone nestedscroll zarówno pionowe i poziome recyclerview:

verticalRecyclerView.setNestedScrollingEnabled(false); 
... add each horizontal recyclerviews: 
horizontalRecyclerView.setNestedScrollingEnabled(false); 
+0

https://stackoverflow.com/questio ns/27083091/recyclerview-inside-scrollview-is-not-working/45466603 # 45466603 Sprawdź ten link .. – maruti060385

Odpowiedz

8

miałem ten sam problem i rozwiązać ten problem dostosowując NeatedScrollView.

Oto klasa dla tego.

MyNestedScrollView

public class MyNestedScrollView extends NestedScrollView { 
    @SuppressWarnings("unused") 
    private int slop; 
    @SuppressWarnings("unused") 
    private float mInitialMotionX; 
    @SuppressWarnings("unused") 
    private float mInitialMotionY; 
    public MyNestedScrollView(Context context) { 
     super(context); 
     init(context); 
    } 
    private void init(Context context) { 
     ViewConfiguration config = ViewConfiguration.get(context); 
     slop = config.getScaledEdgeSlop(); 
    } 
    public MyNestedScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 
    public MyNestedScrollView(Context context, AttributeSet attrs, 
      int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context); 
    } 
    private float xDistance, yDistance, lastX, lastY; 
    @SuppressWarnings("unused") 
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     final float x = ev.getX(); 
     final float y = ev.getY(); 
     switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      // This is very important line that fixes 
      computeScroll(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) { 
       return false; 
      } 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 
    public interface OnScrollChangedListener { 
     void onScrollChanged(NestedScrollView who, int l, int t, int oldl, 
       int oldt); 
    } 
    private OnScrollChangedListener mOnScrollChangedListener; 
    public void setOnScrollChangedListener(OnScrollChangedListener listener) { 
     mOnScrollChangedListener = listener; 
    } 
    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     super.onScrollChanged(l, t, oldl, oldt); 
     if (mOnScrollChangedListener != null) { 
      mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt); 
     } 
    } 
} 

Szczęśliwy kodowania.

+0

https: // stackoverflow.com/questions/27083091/recyclerview-inside-scrollview-is-not-working/45466603 # 45466603 – maruti060385

+1

Czy jest jakaś przewaga nad prostą odpowiedzią [poniżej] (https://stackoverflow.com/a/43536382/905686)? Jeśli nie, rozważ zaakceptowanie prostszego. – user905686

4

[ROZWIĄZANO] Mam taki sam problem z widokiem z widokiem poziomym. Change Gradle repo dla recycleview

skompiluj "com.android.support:recyclerview-v7:23.2.1 ' Napisz to: linearLayoutManager.setAutoMeasureEnabled (true);

Poprawiono błędy związane z różnymi metodami miarą spec w aktualizacji

Sprawdź http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

Znalazłem problem z 23.2.1 biblioteka: Gdy pozycja jest match_parent widok recyklingu wypełnić pełną przedmiot do oglądania, proszę zawsze iść z minimalną wysokością lub "wrap_content".

Dzięki

33

skorzystać z poniższego kodu dla płynnego przewijania:

ViewCompat.setNestedScrollingEnabled(recyclerView, false); 
+0

Dzięki! Działa świetnie. –

+0

To działa i jest proste. Dzięki ! –

+0

umieść go w swoim 'MainActivity.onCreate' lub w dowolnym miejscu, w którym stworzyłeś swój recyclerView – Cano64

1

mam rozwiązać ten problem za pomocą poniższego kodu:

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

     @Override 
     public boolean canScrollVertically() { 
      return true; 
     } 
    }); 
3

dodać to w RecyclerView xml:

android:nestedScrollingEnabled="false" 
+0

To działa tylko dla poziomu API 21 i powyżej dla poziomu API poniżej 21 zobacz odpowiedź Kuldeeps. –

+0

Jeśli używasz wiązania danych w swoim układzie, możesz także utworzyć adapter: @BindingAdapter ("nestedScrollingEnabled") public static void setNestedScrollingEnabled (końcowy widok widoku, ostateczna wartość boolowska) { ViewCompat.setNestedScrollingEnabled (widok, wartość); }, a następnie dodaj do układów za pomocą aplikacji: nestedScrollingEnabled = "@ {false}" –

Powiązane problemy