2016-05-23 21 views
17

iç Recyclerview ile fırlatmak değilNestedScrollView böyle bir düzen var

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

Sorunum:

vertical recyclerview, ACTION_UP gerçekleştiğinde, vertical recyclerview kaydırma yapmaz, vertical recyclerview da kaydırma işlemini durdurur.

nasıl yuva vertical recyclerviewnestedscrollview içine can ve Playstore gibi vertical recyclerviewhorizontal recyclerview ve pürüzsüz kaydırma tutmak.

@vrund Purohit özel iç içe kaydırma görünümü (aşağıda kodu) kullanarak ve engelli nestedscroll dikey ve yatay recyclerview hem:

çözüldü

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

+0

https://stackoverflow.com/questio ns/27083091/recyclerview-içinde-scrollview-is-değil çalışma/45466603 # 45466603 Bu bağlantıyı kontrol edin .. – maruti060385

cevap

8

Bu aynı sorunu vardı ve bu sorunu çözmüş NeatedScrollView'u özelleştirerek.

İşte bunun sınıfı. kodlama

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); 
     } 
    } 
} 

mutlu.

+0

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

+1

Basit cevap [aşağıda] (https://stackoverflow.com/a/43536382/905686) üzerinden bir avantaj var mı? Değilse, daha basit olanı kabul etmeyi düşünün. – user905686

4

[RESOLVED] Yatay geridönüşüm ile aynı sorunum var. Geri dönüşüm için Gradle repo değerini değiştirin

compile 'com.android.support:recyclerview-v7:23.2.1' Bunu yazınız: linearLayoutManager.setAutoMeasureEnabled (true); güncellemesinde çeşitli tedbir spec yöntemlerine ilişkin

Sabit hata

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

Ben bulduk ile sorun 23.2.1 kütüphane: öğe match_parent geri dönüşüm görünümlerde tam öğeyi doldurmak olduğunda, her zaman lütfen gidin min yükseklik veya "wrap_content" ile.

Teşekkür

pürüzsüz kaydırma için kodunun altına
33

Kullanım:

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

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

Teşekkürler! Mükemmel çalışıyor. –

+0

Çalışır ve basittir. Teşekkürler ! –

+0

, "MainActivity.onCreate" inize koyun veya geri dönüştürücünüzü nerede oluşturursanız olun – Cano64

1

kod aşağıda kullanarak sorunu çözdük

android:nestedScrollingEnabled="false" 
3

sizin RecyclerView xml bu ekleyin:

ViewCompat.setNestedScrollingEnabled(recyclerView, false); 
+0

Bu sadece API 21 seviyesinin altında ve 21 numaralı API seviyesinde çalışır, bkz. Kuldeeps cevabı. –

+0

Düzeninizdeki veri bağlamayı kullanıyorsanız, ayrıca bir bağlama günlüğü oluşturabilirsiniz: @BindingAdapter ("nestedScrollingEnabled") public static void setNestedScrollingEnabled (son Görünüm görünümü, son boole değeri) { ViewCompat.setNestedScrollingEnabled (görünüm, değer); } ve ardından uygulamaya sahip düzenlere ekleyin: nestedScrollingEnabled = "@ {false}" –