Wie deaktiviere ich das RecyclerView-Scrollen?

221

Ich kann das Scrollen in der nicht deaktivieren RecyclerView. Ich habe versucht anzurufen rv.setEnabled(false), kann aber trotzdem scrollen.

Wie kann ich das Scrollen deaktivieren?

Zsolt Safrany
quelle
1
Was ist der Sinn der Verwendung, RecyclerViewwenn Sie nicht scrollen möchten?
CommonsWare
16
@CommonsWare, ich möchte es beispielsweise nur vorübergehend deaktivieren, während ich mit einem seiner untergeordneten Elemente eine benutzerdefinierte Animation mache.
Zsolt Safrany
1
Ah, OK, das macht Sinn. Ich hätte wahrscheinlich ein transparentes Viewdarüber gelegt RecyclerView, zwischen VISIBLEund GONEnach Bedarf umgeschaltet , aber von der Manschette her scheint Ihr Ansatz vernünftig.
CommonsWare
Hoffe, dies hilft, eine bessere Lösung zu finden.
Saiteja Parsi
1
@ CommonsWare, hier ist, wofür ich es zum Beispiel brauche. Ich muss Bilder einzeln in RecyclerView anzeigen, ohne teilweise sichtbare Bilder, nur eines in meinem Ansichtsfenster. Links und rechts befinden sich Pfeile, mit denen der Benutzer navigieren kann. Abhängig davon, welches Bild gerade angezeigt wird (es handelt sich um verschiedene Arten), werden einige Dinge außerhalb von RecyclerView ausgelöst. Es ist das Design, das unsere Kunden wollen.
Varvara Kalinina

Antworten:

368

Sie sollten dazu den Layoutmanager Ihrer Recycling-Ansicht überschreiben. Auf diese Weise wird nur das Scrollen deaktiviert, keine der anderen Funktionen. Sie können weiterhin Klick- oder andere Berührungsereignisse verarbeiten. Beispielsweise:-

Original:

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

Hier können Sie mit dem Flag "isScrollEnabled" die Bildlauffunktion Ihrer Recycling-Ansicht vorübergehend aktivieren / deaktivieren.

Ebenfalls:

Überschreiben Sie einfach Ihre vorhandene Implementierung, um das Scrollen zu deaktivieren und das Klicken zu ermöglichen.

 linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};
Saurabh Garg
quelle
2
Dies sollte die richtige Antwort sein, da das Scrollen deaktiviert wird, während ich klicken kann.
Jared Burrows
10
Das Deaktivieren des Bildlaufs in den Standard-LayoutMangers sollte bereits vorhanden sein. Ein Benutzer der API sollte dies nicht tun müssen. Danke für die Antwort!
Martin O'Shea
1
Was ist, wenn ich das Scrollen nur von einem bestimmten Element aus deaktivieren möchte? Das heißt, Sie können nach unten (oder oben) scrollen, aber dann blockiert werden, bis ich es wieder aktiviere?
Android-Entwickler
2
Dies deaktiviert auch glattScrollToPosition
Mladen Rakonjac
4
Sie fügen ein Kotlin-Versionsobjekt hinzu: LinearLayoutManager (this) {Spaß überschreiben canScrollVertically (): Boolean {return false}}
amorenew
149

Die wirkliche Antwort ist

recyclerView.setNestedScrollingEnabled(false);

Weitere Infos in der Dokumentation

Bozic Nebojsa
quelle
39
Dadurch wird nur das verschachtelte Scrollen deaktiviert, nicht das gesamte Scrollen. Insbesondere wenn sich Ihre RecyclerView in einer ScrollView befindet, aber den Bildschirm nicht ausfüllt, wird die ScrollView nicht gescrollt (Inhalt passt in den Bildschirm), und Sie erhalten die Scroll-Benutzeroberfläche in Ihrer RecyclerView (Ende des Listeneffekts, wenn Sie beispielsweise versuchen zu scrollen ), obwohl es nicht scrollen wird, wenn es größer wird. Das Erweitern des LayoutManager macht wirklich den Job.
personne3000
3
@ personne3000 Ich glaube, recyclerView.setHasFixedSize (true) macht den Job dafür. Bearbeiten: Ich verwende dies auch in Verbindung mit setFillViewport (true), daher bin ich mir nicht sicher, welche der beiden Lösungen dies behebt.
mDroidd
5
Dies funktioniert gut für mich, aber mein "RecyclerView" befand sich in einem Fragment-Layout mit "ScrollView", sodass ich das "ScrollView" durch "NestedScrollView" ändern musste, wie hier beschrieben: stackoverflow.com/a/38088902/618464
Educoutinho
1
Denken Sie daran , den vollständigen Klassennamen verwenden für NestedScrollView: android.support.v4.widget.NestedScrollViewwie hier beschrieben, durch chessdork: stackoverflow.com/questions/37846245/...
gustavoknz
Nachdem ich 4 Stunden damit verbracht hatte herauszufinden, was falsch ist, löste dies mein Problem. In meinem Fall verwende ich eine Recycling-Ansicht in einem MotionLayout. Und ich habe nur einen Wischbereich hinzugefügt, um ihn durch Hinzufügen von Bewegung nach oben zu ziehen: touchAnchorId = "@ id / swipe_area". Es funktioniert normal, wird aber auch ausgelöst, wenn die leeren Bereiche von recyclerview berührt werden. Seien Sie vorsichtig, wenn Sie motionLayout mit anderen wischbaren Elementen verwenden.
O. Kumru
73

Die REAL REAL-Antwort lautet: Für API 21 und höher:

Kein Java-Code erforderlich. Sie können android:nestedScrollingEnabled="false" in XML festlegen :

<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">
Milad Faridnia
quelle
11
Ich denke, dies sollte die akzeptierte Antwort sein. Ohne Anstrengung im Unterricht können Sie das Scrollen deaktivieren und dennoch ist das Berühren im Layout zulässig.
VipiN Negi
Was ist für APIs unter 21?
Mouaad Abdelghafour AITALI
@pic für niedrigere APIs, die Sie verwenden können: recyclerView.setNestedScrollingEnabled (false);
Milad Faridnia
1
Akzeptierte Antwort für mich.
Fernando Torres
1
Dies ist die beste und einfachste Antwort, die auch unnötige Codeverschmutzung und endlose Muster zur Klassenerweiterung vermeidet.
Raphael C
52

Dies ist eine etwas hackige Problemumgehung, aber es funktioniert. Sie können das Scrollen in der aktivieren / deaktivieren RecyclerView.

Dies ist ein leerer RecyclerView.OnItemTouchListenerDiebstahl jedes Berührungsereignisses, wodurch das Ziel deaktiviert wird 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) {

    }
}

Es benutzen:

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 
Zsolt Safrany
quelle
8
Deaktiviert dies auch das Klicken des Elements?
Jahir Fiquitiva
@JahirFiquitiva Ja. "Dies ist ein leerer RecyclerView.OnItemTouchListener, der jedes Berührungsereignis stiehlt"
Max
1
Dies deaktiviert auch die Schriftrolle der übergeordneten Ansicht
Jemshit Iskenderov
Dies deaktiviert Artikelklick auch
Muhammad Riyaz
1
Warum eine hackige Problemumgehung (mit Nebenwirkungen) verwenden, wenn es eine saubere Lösung gibt? Überschreiben Sie einfach den LayoutManager (siehe andere Antworten)
personne3000
37

Das funktioniert bei mir:

  recyclerView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
          return true;
      }
  });
Alxgarcia
quelle
11
Dies deaktiviert jede Berührung.
Jared Burrows
1
Guter Trick! Um es wieder zu aktivieren, setzen Sie einfach onTouchListener's onTouch zurück, um false zurückzugeben
HendraWD
Ähm, aber es gibt eine WarnungCustom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
HendraWD
Wenn Sie die gleiche Warnung erhalten, die @HendraWD im obigen Kommentar erwähnt hat, sehen Sie sich die Antworten dieser Frage an: stackoverflow.com/questions/46135249/…
Nicolás Carrasco
1
Anstatt true zurückzugeben und daher alle Arten von Touch-Ereignissen zu deaktivieren, werden return e.getAction() == MotionEvent.ACTION_MOVE;stattdessen return true;nur Scroll- / Swipe-Ereignisse abgebrochen.
Toufic Batache
15

Sie können das Scrollen deaktivieren, indem Sie RecyclerView einfrieren.

Frieren: recyclerView.setLayoutFrozen(true)

Zum Auftauen: recyclerView.setLayoutFrozen(false)

Virat Singh
quelle
1
Beachten Sie: Untergeordnete Ansichten werden nicht aktualisiert, wenn RecyclerView eingefroren ist. Ich muss das Scrollen deaktivieren, wenn auf dem Bildschirm genügend Platz ist, um alle Elemente anzuzeigen. Oh ... Was für eine schöne Android-API für diese Aufgabe ...
Oleksandr Nos
1
Veraltet in API 28
OhhhThatVarun
13

Erstellen Sie eine Klasse, die die RecyclerView- Klasse erweitert

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

Dadurch wird das Bildlaufereignis deaktiviert, nicht jedoch die Klickereignisse

Verwenden Sie dies in Ihrem XML, um Folgendes zu tun:

  <com.yourpackage.xyx.NonScrollRecyclerView 
     ...
     ... 
  />
Ashish
quelle
Vielen Dank! Dies alles ist erforderlich, wenn die Recycler-Ansicht ohne internes Scrollen die volle Höhe des Inhalts annehmen soll. :)
Rahul Rastogi
Befindet sich diese Recycler-Ansicht jedoch in einer Bildlaufansicht (z. B. ScrollView), sollte der Layout-Manager die Methode canScrollVertically () überschreiben, die false zurückgibt.
Rahul Rastogi
@ RahulRastogi verwenden NestedScrollView anstelle von ScrollView
Ashish
Hey @AshishMangave, bitte sagen Sie, wie man es wieder programmgesteuert aktiviert
Shruti
@ Shruti wir können das nicht programmatisch machen. bcz wir überschreiben direkt die onMeasure-Methode von recyclerview. Sie können versuchen, diese recyclerView.setNestedScrollingEnabled (false) zu verwenden. Dies wird Ihnen helfen
Ashish
11

Wenn Sie nur deaktivieren nur Scroll - Funktionalität von RecyclerViewdann können Sie verwenden setLayoutFrozen(true);Methode RecyclerView. Es kann jedoch kein Touch-Ereignis deaktiviert werden.

your_recyclerView.setLayoutFrozen(true);
Ekta Bhawsar
quelle
Diese Methode ist veraltet. Kannst du einen anderen vorschlagen?
Aiyaz Parmar
Veraltet in API 28
OhhhThatVarun
9
recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // Stop only scrolling.
            return rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING;
        }
    });

Rajesh
quelle
Dies bricht das Scrollen vonoothScrollToPosition () ab, wenn es berührt wird.
Ypresto
Dies ist die beste Lösung für mich, da es das programmgesteuerte Scrollen ermöglicht, aber das Scrollen durch den Benutzer vermeidet.
Miguel Sesma
7

Es gibt eine wirklich einfache Antwort.

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

Der obige Code deaktiviert das vertikale Scrollen von RecyclerView.

Emi Raz
quelle
6

Schrieb eine Kotlin-Version:

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
}

Verwendung:

recyclerView.layoutManager = NoScrollLinearLayoutManager(context)
(recyclerView.layoutManager as NoScrollLinearLayoutManager).disableScrolling()
Ich bin ein Froschdrache
quelle
5

Erweitern Sie das LayoutManagerund überschreiben Sie canScrollHorizontally()und canScrollVertically()deaktivieren Sie das Scrollen.

Beachten Sie, dass das Einfügen von Elementen am Anfang nicht automatisch zum Anfang zurückblättert. Um dies zu umgehen, gehen Sie wie folgt vor:

  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);
          }
        }
      }
    });
  }
Aidanvii
quelle
1
Dies deaktiviert auch glattScrollToPosition
Mladen Rakonjac
5

Ich weiß, dass dies bereits eine akzeptierte Antwort hat, aber die Lösung berücksichtigt keinen Anwendungsfall, auf den ich gestoßen bin.

Ich brauchte speziell ein Header-Element, das noch anklickbar war, aber den Bildlaufmechanismus von RecyclerView deaktivierte. Dies kann mit dem folgenden Code erreicht werden:

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

    }
});
Ryan Simon
quelle
Aus irgendeinem Grund müssen Sie genau richtig klicken, ohne sich zu bewegen, damit dies funktioniert.
Jared Burrows
Guter Punkt, @JaredBurrows. Dies liegt daran, dass wir ACTION_MOVE nicht berücksichtigen. Damit sich Berührungen natürlich anfühlen, gibt es ein gewisses Geben zwischen Berühren und leichten Bewegungen auf dem Bildschirm. Leider konnte ich dieses Problem nicht lösen.
Ryan Simon
Danke, genau das, was ich brauchte!
Student
5

Wie setLayoutFrozenveraltet, können Sie das Scrollen deaktivieren, indem Sie RecyclerView mithilfe von einfrieren suppressLayout.

Frieren:

recyclerView.suppressLayout(true)

Zum Auftauen:

recyclerView.suppressLayout(false)
Shylendra Madda
quelle
4

in XML: -

Du kannst hinzufügen

android:nestedScrollingEnabled="false"

in der untergeordneten XML-Datei des RecyclerView-Layouts

oder

in Java: -

childRecyclerView.setNestedScrollingEnabled(false);

zu Ihrem RecyclerView in Java-Code.

Verwenden von ViewCompat (Java): -

childRecyclerView.setNestedScrollingEnabled(false);funktioniert nur in android_version> 21 Geräten. Verwenden Sie Folgendes, um auf allen Geräten zu arbeiten

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);

jafarbtech
quelle
Excelent, alle Apis abgedeckt, sollte eingeschaltet sein.
Ricard
3

Aus irgendeinem Grund funktioniert die Antwort von @Alejandro Gracia erst nach wenigen Sekunden. Ich habe eine Lösung gefunden, die RecyclerView sofort blockiert:

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) {
            }
        });
vovahost
quelle
3

Überschreiben Sie onTouchEvent () und onInterceptTouchEvent () und geben Sie false zurück, wenn Sie OnItemTouchListener überhaupt nicht benötigen. Dadurch werden OnClickListeners von ViewHolders nicht deaktiviert.

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;
    }
}
ypresto
quelle
3

Sie können diese Zeile hinzufügen, nachdem Sie Ihren Adapter eingestellt haben

ViewCompat.setNestedScrollingEnabled(recyclerView, false);

Jetzt funktioniert Ihre Recycling-Ansicht mit reibungslosem Scrollen

Atefeh Srch
quelle
2

Ich habe seit einigen Stunden Probleme mit dieser Ausgabe. Daher möchte ich meine Erfahrungen mitteilen. Für die layoutManager-Lösung ist dies in Ordnung, aber wenn Sie das Scrollen wieder aktivieren möchten, wird der Recycler wieder nach oben verschoben.

Die bisher beste Lösung (zumindest für mich) ist die Verwendung der @ Zsolt Safrany-Methode, aber das Hinzufügen von Getter und Setter, damit Sie den OnItemTouchListener nicht entfernen oder hinzufügen müssen.

Wie folgt

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

Verwendung

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

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

Wenn Sie in Kotlin keine zusätzliche Klasse nur zum Festlegen eines Werts erstellen möchten, können Sie in LayoutManager eine anonyme Klasse erstellen:

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

So habe ich es mit der Datenbindung gemacht:

            <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}"/>

Anstelle von "true" habe ich eine boolesche Variable verwendet, die sich aufgrund einer Bedingung geändert hat, sodass die Recycler-Ansicht zwischen deaktiviert und aktiviert wechselt.

bwhite
quelle
1

Kam mit einem Fragment rüber, das mehrere RecycleView enthält, sodass ich in jeder RecycleView nur eine Bildlaufleiste anstelle einer Bildlaufleiste benötige.

Also habe ich einfach die ScrollView in den übergeordneten Container gestellt, der die 2 RecycleViews enthält, und sie android:isScrollContainer="false"in der RecycleView verwendet

<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" />
pk028382
quelle
1

Hinzufügen

android:descendantFocusability="blocksDescendants"

in Ihrem Kind von SrollView oder NestedScrollView (und einem Elternteil von ListView, Recyclerview und Gridview)

Pankaj Talaviya
quelle
1

Es gibt eine einfachere Möglichkeit, das Scrollen zu deaktivieren (technisch gesehen ist es eher das Abfangen eines Bildlaufereignisses und das Beenden, wenn eine Bedingung erfüllt ist), indem nur die Standardfunktionalität verwendet wird. RecyclerViewhat die Methode aufgerufen addOnScrollListener(OnScrollListener listener), und wenn Sie nur diese verwenden, können Sie das Scrollen stoppen, nur so:

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

Anwendungsfall: Angenommen, Sie möchten das Scrollen deaktivieren, wenn Sie auf eines der darin enthaltenen Elemente klicken, RecyclerViewdamit Sie einige Aktionen damit ausführen können, ohne durch versehentliches Scrollen zu einem anderen Element abgelenkt zu werden. Wenn Sie damit fertig sind, klicken Sie einfach auf das Element erneut, um das Scrollen zu aktivieren. Zu diesem Zweck möchten Sie OnClickListeneran jedes Element in diesem Element anhängen. RecyclerViewWenn Sie also auf ein Element klicken, wird isItemSelectedvon falsezu umgeschaltet true. Auf diese Weise , wenn Sie blättern versuchen, RecyclerViewwird Methode automatisch aufrufen onScrollStateChangedund da isItemSelectedSatz true, wird es sofort zu stoppen, bevor RecyclerViewdie Chance bekam, gut ... zu blättern.

Hinweis: Versuchen Sie zur besseren Benutzerfreundlichkeit, Klicks zu verwenden, GestureListeneranstatt sie OnClickListenerzu verhindern accidental.

Tim Jorjev
quelle
stopScroll()dient nicht zum Einfrieren der Schriftrolle, sondern nur zum Anhalten / Stoppen des Bildlaufs in der Recyclingansicht.
Farid
@FARID, ja, diese Methode hält nur jede blättert im Gang, und in diesem speziellen Fall, tut es , dass jedes Mal , wenn ein Benutzer versucht RecyclerView Inhalt mit Blättern isItemSelectedzu Satz true. Andernfalls benötigen Sie eine benutzerdefinierte RecyclerView, um das Scrollen endgültig zu deaktivieren, und ich wollte dies vermeiden, da ich nur ein wenig zusätzliche Funktionalität benötigte, die diese Lösung bietet.
Tim Jorjev
0

Fügen Sie dies einfach Ihrer Recycling-Ansicht in XML hinzu

 android:nestedScrollingEnabled="false"

so was

<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">
anas
quelle
0

Um das Scrollen durch Berühren zu beenden, aber weiter über Befehle zu scrollen:

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