RecyclerView kaydırmayı nasıl devre dışı bırakabilirim?


221

İçindeki kaydırmayı devre dışı bırakamıyorum RecyclerView. Aramaya çalıştım rv.setEnabled(false)ama yine de kaydırabilirim.

Kaydırmayı nasıl devre dışı bırakabilirim?


1
RecyclerViewKaydırma yapmak istemiyorsanız ne kullanmanız gerekir ?
CommonsWare

16
@CommonsWare, örneğin çocuklarından biriyle özel bir animasyon yaparken geçici olarak devre dışı bırakmak istiyorum.
Zsolt Safrany

1
Ah, tamam, bu mantıklı. Muhtemelen , arasında ve gerektiğinde geçiş Viewyaparak şeffaf bir şekilde yerleştirirdim , ancak manşetten yaklaşımınız makul görünüyor. RecyclerViewVISIBLEGONE
CommonsWare

Umarım bu daha iyi bir çözüm bulmanıza yardımcı olur.
Saiteja Parsi

1
@CommonsWare, örneğin bunun için ihtiyacım olan şey. Kısmen görünür görüntüler olmadan, yalnızca bir kez görünümümde RecyclerView'da görüntüleri tek tek görüntülemem gerekiyor. Ve sol ve sağ tarafta kullanıcının gidebileceği oklar var. Şu anda hangi görüntünün görüntülendiğine bağlı olarak (bunlar çeşitli türlerde), RecyclerView dışındaki bazı şeyler tetiklenir. Müşterilerimizin istediği tasarım.
Varvara Kalinina

Yanıtlar:


368

Bunun için geri dönüşüm görünümünüzün yerleşim yöneticisini geçersiz kılmalısınız. Bu şekilde sadece kaydırmayı devre dışı bırakır, diğer işlevlerin hiçbiri. Yine de tıklama veya diğer dokunma etkinliklerini gerçekleştirebileceksiniz. Örneğin:-

Orijinal:

 public class CustomGridLayoutManager extends LinearLayoutManager {
 private boolean isScrollEnabled = true;

 public CustomGridLayoutManager(Context context) {
  super(context);
 }

 public void setScrollEnabled(boolean flag) {
  this.isScrollEnabled = flag;
 }

 @Override
 public boolean canScrollVertically() {
  //Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll
  return isScrollEnabled && super.canScrollVertically();
 }
}

Burada "isScrollEnabled" işaretini kullanarak geri dönüşüm görünümünüzün kaydırma işlevini geçici olarak etkinleştirebilir / devre dışı bırakabilirsiniz.

Ayrıca:

Kaydırmayı devre dışı bırakmak ve tıklamaya izin vermek için mevcut uygulamanızı basitçe geçersiz kılın.

 linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};

2
Tıklamama izin verirken kaydırmayı devre dışı bıraktığı için bu doğru cevap olmalıdır.
Jared Burrows

10
Varsayılan LayoutMangers öğesinde kaydırmayı devre dışı bırakma zaten mevcut olmalıdır, API kullanıcısı bunu yapmak zorunda değildir. Yine de cevap için teşekkürler!
Martin O'Shea

1
Yalnızca belirli bir öğeden kaydırmayı devre dışı bırakmak istersem ne olur? Yani, onu tekrar etkinleştirene kadar aşağı (veya yukarı) kaydırabilir, ancak daha sonra engellenebilirsiniz?
android geliştirici

2
Bu ayrıca smoothScrollToPosition
Mladen Rakonjac

4
kotlin sürüm nesnesini eklersiniz: LinearLayoutManager (this) {override fun canScrollVertically (): Boolean {return false}}
amorenew

149

Gerçek cevap

recyclerView.setNestedScrollingEnabled(false);

Dokümanlarda daha fazla bilgi


39
Bu, yalnızca iç içe kaydırmayı devre dışı bırakır, tüm kaydırmayı devre dışı bırakır. Özellikle, RecyclerView cihazınız bir ScrollView içindeyse ancak ekranı doldurmazsa, ScrollView kaydırma yapmaz (ekrana sığar) ve örneğin kaydırma yapmaya çalışırken kaydırma UI'sini RecyclerView (liste sonu efekti) olarak alırsınız. ) büyüdüğünde kaydırma yapmasa bile. LayoutManager'ı genişletmek gerçekten işi yapar.
personne3000

3
@ personne3000 Ben recyclerView.setHasFixedSize (true) bunun için iş yaptığını düşünüyorum. Düzenleme: Ben de setFillViewport (true) ile birlikte bu kullanın, bu yüzden aslında iki düzeltme hangisi olduğundan emin değilim.
mDroidd

5
Bu benim için iyi çalışıyor, ama benim "RecyclerView" "ScrollView" kullanarak bir Fragment düzeni içinde, bu yüzden burada açıklandığı gibi "NestedScrollView" tarafından "ScrollView" değiştirmek zorunda kaldı: stackoverflow.com/a/38088902/618464
educoutinho

1
Tam sınıf adını kullanmayı unutmayın NestedScrollView: android.support.v4.widget.NestedScrollView, chessdork tarafından, burada açıklandığı şekilde: stackoverflow.com/questions/37846245/...
gustavoknz

Neyin yanlış olduğunu anlamaya çalışmak için 4 saat geçirdikten sonra bu sorunumu çözdü. Benim durumumda bir MotionLayout içinde bir geri dönüşüm görünümü kullanıyorum. Ve sadece hareket ekleyerek sürüklemek için bir kaydırma alanı ekledim: touchAnchorId = "@ id / swipe_area". Normal olarak çalışır, ancak geri dönüşüm görünümünün boş alanlarına dokunduğunda da tetiklenir. MotionLayout'u diğer kaydırılabilir öğelerle kullanırken dikkatli olun.
O. Kumru

73

REAL REAL yanıtı: API 21 ve üstü için:

Java kodu gerekmez. android:nestedScrollingEnabled="false" Xml olarak ayarlayabilirsiniz :

<android.support.v7.widget.RecyclerView
     android:id="@+id/recycler"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:clipToPadding="true"
     android:nestedScrollingEnabled="false"
     tools:listitem="@layout/adapter_favorite_place">

11
Bunun kabul edilen cevap olması gerektiğini düşünüyorum, sınıfta herhangi bir çaba sarf etmeden kaydırmayı devre dışı bırakabilirsiniz ve yine de düzende dokunmaya izin verilir.
VipiN Negi

21'in altındaki API'lar için ne var ??
Mouaad Abdelghafour AITALI

Kullanabileceğiniz daha düşük API'lar için @pic: recyclerView.setNestedScrollingEnabled (false);
Milad Faridnia

1
Benim için kabul edilen cevap.
Fernando Torres

1
Bu, gereksiz kod kirliliğini ve sonsuz sınıf genişletme modellerini de önleyen en iyi ve en açık cevaptır.
Raphael C

52

Bu biraz hileli bir çözüm ama işe yarıyor; içinde kaydırmayı etkinleştirebilir / devre dışı bırakabilirsiniz RecyclerView.

Bu, RecyclerView.OnItemTouchListenerher dokunma olayını çalmak ve böylece hedefi devre dışı bırakmak için boş bir çalmadır RecyclerView.

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return true;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

Kullanma:

RecyclerView rv = ...
RecyclerView.OnItemTouchListener disabler = new RecyclerViewDisabler();

rv.addOnItemTouchListener(disabler);        // disables scolling
// do stuff while scrolling is disabled
rv.removeOnItemTouchListener(disabler);     // scrolling is enabled again 

8
Bu, öğenin tıklanmasını da devre dışı bırakıyor mu?
Jahir Fiquitiva

@JahirFiquitiva Evet. "Bu boş bir RecyclerView.OnItemTouchListener her dokunma olayını çalmak"
Max

1
Bu aynı zamanda üst görünümün kaydırmasını da devre dışı bırakır
Jemshit Iskenderov

Bu, öğe tıklamasını da devre dışı bırakır
Muhammad Riyaz

1
Temiz bir çözüm olduğunda neden hackish bir geçici çözüm (yan etkilerle) kullanıyorsunuz? LayoutManager'ı geçersiz kılın (diğer yanıtlara bakın)
personne3000

37

Bu benim için çalışıyor:

  recyclerView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
          return true;
      }
  });

11
Bu, tüm dokunuşu devre dışı bırakır.
Jared Burrows

1
İyi numara! Tekrar etkinleştirmek için, onTouchListener'ın onTouch ayarını false değerine döndürecek şekilde yeniden ayarlamanız yeterli
HendraWD

uhm, ama bir uyarı varCustom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
HendraWD

Yukarıdaki yorumda @HendraWD ile aynı uyarıyı alıyorsanız, bu sorunun yanıtlarına bir göz atın: stackoverflow.com/questions/46135249/…
Nicolás Carrasco

1
True değerini döndürmek ve bu nedenle her türlü dokunma olayını devre dışı bırakmak return e.getAction() == MotionEvent.ACTION_MOVE;yerine, return true;yalnızca kaydırma / kaydırma olayları iptal edilir.
Toufic Batache

15

RecyclerView öğenizi dondurarak kaydırmayı devre dışı bırakabilirsiniz.

Dondurmak: recyclerView.setLayoutFrozen(true)

Dondurmayı kaldırmak için: recyclerView.setLayoutFrozen(false)


1
Not alın: RecyclerView dondurulduğunda alt görünümler güncellenmez. Ekranda tüm öğeleri gösterecek kadar yer olduğunda kaydırmayı devre dışı bırakmam gerekiyor. Oh ... Bu görev için ne güzel bir Android API ...
Oleksandr Nos

1
API 28'de kullanımdan
kaldırıldı

13

RecyclerView sınıfını genişleten sınıf oluşturma

public class NonScrollRecyclerView extends RecyclerView {

    public NonScrollRecyclerView(Context context) {
        super(context);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
}

Bu, scroll olayını devre dışı bırakır, ancak tıklama olaylarını devre dışı bırakmaz

Bunu XML'inizde kullanın aşağıdakileri yapın:

  <com.yourpackage.xyx.NonScrollRecyclerView 
     ...
     ... 
  />

Teşekkürler! Tüm bunlar, geri dönüşümcü görünümünün dahili kaydırma yapılmadan içeriğe göre tam yükseklik almasına izin vermek istediğimizde gereklidir. :)
Rahul Rastogi

Ancak bu geri dönüşüm görünümü kayan bir görünümdeyse (egScrollView), mizanpaj yöneticisi ondan false döndüren canScrollVertically () yöntemini geçersiz kılmalıdır.
Rahul Rastogi

@RahulRastogi ScrollView yerine NestedScrollView kullan
Ashish

Hey @AshishMangave, Lütfen programlı olarak nasıl yeniden etkinleştirileceğini söyleyin
Shruti

@Shruti bunu programlı yapamayız. bcz biz doğrudan recyclerview 'ın onMeasure yöntemini geçersiz kılar. bu recyclerView.setNestedScrollingEnabled (false) için deneyebilirsiniz. bu size yardımcı olacaktır
Ashish

11

Sadece devre dışı ise sadece kaydırma işlevselliği ait RecyclerViewo zaman kullanabilirsiniz setLayoutFrozen(true);yöntemini RecyclerView. Ancak dokunmatik olayı devre dışı bırakamazsınız.

your_recyclerView.setLayoutFrozen(true);

bu yöntem kullanımdan kaldırılmıştır. başka bir tane önerebilir misin?
Aiyaz Parmar

API 28'de kullanımdan
kaldırıldı

9
recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // Stop only scrolling.
            return rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING;
        }
    });


Bu, dokunulduğunda smoothScrollToPosition () öğesinin kaydırılmasını iptal eder.
ypresto

Bu benim için en iyi çözüm çünkü programlı kaydırmaya izin veriyor ancak kullanıcının kaydırmasını önlüyor.
Miguel Sesma

7

Gerçekten basit bir cevap var.

LinearLayoutManager lm = new LinearLayoutManager(getContext()) {
                @Override
                public boolean canScrollVertically() {
                    return false;
                }
            };

Yukarıdaki kod RecyclerView dikey kaydırmayı devre dışı bırakır.



6

Bir kotlin sürümü yazdı:

class NoScrollLinearLayoutManager(context: Context?) : LinearLayoutManager(context) {
    private var scrollable = true

    fun enableScrolling() {
        scrollable = true
    }

    fun disableScrolling() {
        scrollable = false
    }

    override fun canScrollVertically() =
            super.canScrollVertically() && scrollable


    override fun canScrollHorizontally() =
            super.canScrollVertically()

 && scrollable
}

kullanımı:

recyclerView.layoutManager = NoScrollLinearLayoutManager(context)
(recyclerView.layoutManager as NoScrollLinearLayoutManager).disableScrolling()

5

Uzatın LayoutManagerve geçersiz canScrollHorizontally()ve canScrollVertically()devre dışı kaydırma için.

Başlangıçta öğe eklemenin otomatik olarak başa geri dönmeyeceğini unutmayın, bunun üstesinden gelmek için şöyle bir şey yapın:

  private void clampRecyclerViewScroll(final RecyclerView recyclerView)
  {
    recyclerView.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
    {
      @Override
      public void onItemRangeInserted(int positionStart, int itemCount)
      {
        super.onItemRangeInserted(positionStart, itemCount);
        // maintain scroll position at top
        if (positionStart == 0)
        {
          RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
          if (layoutManager instanceof GridLayoutManager)
          {
            ((GridLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }else if(layoutManager instanceof LinearLayoutManager)
          {
            ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }
        }
      }
    });
  }

1
bu da devre dışı bırakır smoothScrollToPosition
Mladen Rakonjac

5

Bunun zaten kabul edilmiş bir cevabı olduğunu biliyorum, ancak çözüm, karşılaştığım bir kullanım durumunu hesaba katmıyor.

Özellikle hala tıklanabilir, ancak RecyclerView kaydırma mekanizmasını devre dışı bırakılmış bir başlık öğesi gerekiyordu. Bu, aşağıdaki kodla gerçekleştirilebilir:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                            @Override
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
         return e.getAction() == MotionEvent.ACTION_MOVE;
     }

     @Override
     public void onTouchEvent(RecyclerView rv, MotionEvent e) {

     }

     @Override
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

Herhangi bir nedenle, bunun çalışması için hareket etmeden sadece sağ tıklamanız gerekir.
Jared Burrows

İyi nokta, @JaredBurrows. Bunun nedeni ACTION_MOVE bilgisini yok saymamızdır. Dokunmanın doğal hissetmesi için, ekranda dokunma ile hafif hareket arasında bir miktar değer verilir. Ne yazık ki, bu sorunu çözemedim.
Ryan Simon

Teşekkürler, tam olarak ihtiyacım olan şey!
Öğrenci

5

Kullanımdan setLayoutFrozenkaldırıldığı gibi , tuşunu kullanarak RecyclerView öğenizi dondurarak kaydırmayı devre dışı bırakabilirsiniz suppressLayout.

Dondurmak:

recyclerView.suppressLayout(true)

Dondurmayı kaldırmak için:

recyclerView.suppressLayout(false)

4

XML'de: -

Ekleyebilirsin

android:nestedScrollingEnabled="false"

alt RecyclerView düzeni XML dosyasında

veya

Java dilinde: -

childRecyclerView.setNestedScrollingEnabled(false);

Java kodundaki RecyclerView'inize.

ViewCompat (Java) kullanma: -

childRecyclerView.setNestedScrollingEnabled(false);yalnızca android_version> 21 cihazda çalışır. tüm cihazlarda çalışmak için aşağıdakileri kullanın

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);


Mükemmel, tüm apis kapalı, güçlendirilmelidir.
Ricard

3

Herhangi bir nedenle @Alejandro Gracia cevabı sadece birkaç saniye sonra çalışmaya başlar. RecyclerView'ı anında engelleyen bir çözüm buldum:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                return true;
            }
            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            }
            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            }
        });

3

OnTouchEvent () ve onInterceptTouchEvent () öğelerini geçersiz kılın ve OnItemTouchListener'a ihtiyacınız yoksa false değerini döndürün. Bu, ViewHolders'ın OnClickListeners öğesini devre dışı bırakmaz.

public class ScrollDisabledRecyclerView extends RecyclerView {
    public ScrollDisabledRecyclerView(Context context) {
        super(context);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }
}

3

Adaptörünüzü ayarladıktan sonra bu satırı ekleyebilirsiniz

ViewCompat.setNestedScrollingEnabled(recyclerView, false);

Artık geri dönüşüm görünümünüz yumuşak kaydırma ile çalışacak


2

Ben bu konuda bir saattir mücadele ediyorum, Bu yüzden deneyimlerimi paylaşmak istiyorum, layoutManager çözümü için gayet iyi ama u yeniden etkinleştirmek kaydırma geri almak istiyorsanız geri dönecektir.

Şimdiye kadar en iyi çözüm (en azından benim için) @Zsolt Safrany yöntemini kullanmak, ancak alıcı ve ayarlayıcı eklemek, böylece OnItemTouchListener'ı kaldırmak veya eklemek zorunda değilsiniz.

Aşağıdaki gibi

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    boolean isEnable = true;

    public RecyclerViewDisabler(boolean isEnable) {
        this.isEnable = isEnable;
    }

    public boolean isEnable() {
        return isEnable;
    }

    public void setEnable(boolean enable) {
        isEnable = enable;
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return !isEnable;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {}

   @Override
   public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept){}
 }

kullanım

RecyclerViewDisabler disabler = new RecyclerViewDisabler(true);
feedsRecycler.addOnItemTouchListener(disabler);

// TO ENABLE/DISABLE JUST USE THIS
disabler.setEnable(enable);

2

Kotlin'de, yalnızca bir değer ayarlamak için fazladan bir sınıf oluşturmak istemiyorsanız, LayoutManager'dan anonim bir sınıf oluşturabilirsiniz:

recyclerView.layoutManager = object : LinearLayoutManager(context) {
    override fun canScrollVertically(): Boolean = false
}

1

Veri bağlama ile nasıl yaptım:

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipChildren="false"
                android:onTouch="@{(v,e) -> true}"/>

"Doğru" yerine, geri dönüştürücünün görünümünün devre dışı bırakılması ile etkinleştirilmesi arasında geçiş yapması için bir koşula bağlı olarak değişen bir boole değişkeni kullandım.


1

Birden çok RecycleView içeren bir parça ile karşılaştım, bu yüzden her RecycleView bir kaydırma çubuğu yerine sadece bir kaydırma çubuğuna ihtiyacım var.

Sadece 2 RecycleViews ve kullanımını içeren üst kapta scrollview koymak Yani android:isScrollContainer="false"RecycleView içinde

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    android:isScrollContainer="false" />

1

Ekle

android:descendantFocusability="blocksDescendants"

SrollView veya NestedScrollView (ve herhangi bir ListView, recyclerview ve gridview'in üstü)


1

Yalnızca standart işlevselliği kullanarak kaydırmayı devre dışı bırakmanın daha basit bir yolu vardır (teknik olarak bir kaydırma olayının durdurulması ve bir koşul karşılandığında sona erdirilmesi). RecyclerViewyöntemi denir addOnScrollListener(OnScrollListener listener)ve sadece bunu kullanarak kaydırma işlemini durdurabilirsiniz, sadece:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (viewModel.isItemSelected) {
            recyclerView.stopScroll();
        }
    }
});

Kullanım örneği: İçerideki öğelerden birine tıkladığınızda kaydırmayı devre dışı bırakmak istediğinizi varsayalım, RecyclerViewböylece yanlışlıkla başka bir öğeye kaydırmaktan rahatsız olmadan bazı eylemleri gerçekleştirebilirsiniz ve öğeyi tamamladığınızda, kaydırmayı etkinleştirmek için öğeyi tekrar seçin. Bunun için, eklemek isterim OnClickListeneriçindeki her öğenin RecyclerView, yani bir öğenin üzerine tıkladığınızda, bu geçiş olacağını isItemSelectedgelen falseetmek true. Bu şekilde kaydırmaya çalıştığınızda, RecyclerViewotomatik olarak yöntemi çağırır onScrollStateChangedve olarak isItemSelectedayarlandığından , şansı yakalamadan truehemen önce durur RecyclerView, iyi ... kaydırma.

Not: daha iyi kullanılabilirlik için tıklamaları önlemek GestureListeneryerine kullanmayı deneyin .OnClickListeneraccidental


stopScroll()kaydırmayı dondurmak değil, sadece geri dönüşüm görüntülemesini durdurmak / durdurmak içindir.
Farid

@FARID, evet, bu yöntem devam eden herhangi bir kaydırmayı durdurur ve bu özel durumda, kullanıcı RecyclerView içeriğini isItemSelectedayarlanmış olarak kaydırmaya çalıştığında bunu yapar true. Aksi takdirde, iyi kaydırmayı devre dışı bırakmak için özel bir RecyclerView'e ihtiyacınız olacak ve bu çözümün sağladığı biraz ekstra işlevselliğe ihtiyaç duyduğum için bundan kaçınmak istedim.
Tim Jorjev

0

Bunu xml'de geri dönüşüm görünümünüze eklemeniz yeterli

 android:nestedScrollingEnabled="false"

bunun gibi

<android.support.v7.widget.RecyclerView
                    android:background="#ffffff"
                    android:id="@+id/myrecycle"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:nestedScrollingEnabled="false">

0

Dokunarak kaydırmayı durdurmak, ancak komutlarla kaydırmaya devam etmek için:

if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);

        appTopBarMessagesRV.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

                if ( rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING)
                {
                     // Stop  scrolling by touch

                    return false;
                }
                return  true;
            }
        });
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.