web-dev-qa-db-de.com

Bildlauf in untergeordnetem Recyclerview-Android deaktivieren

Ich habe ein Layout aus einem übergeordneten RecyclerView mit einem untergeordneten Recyclerview

ich weiß, dass es nicht gut ist, eine Liste in eine andere Liste einzufügen, aber ich muss die Unterlistenfunktionen wie Wischen und Ziehen und Ablegen verwenden 

Mein Problem ist, dass das untergeordnete Recyclerview den Fokus erhält und das Scrollen des übergeordneten Elements verhindert, wenn der Berührungspunkt darauf ist Ich möchte nur, wenn die Berührung vertikal auf dem untergeordneten Recyclerview war. __ war horizontal oder ein Klick, dann wischt das untergeordnete Element der Wiederholungsliste nach links und rechts. Irgendwelche Hilfe, um dies zu erreichen?

14

Ich habe endlich eine Lösung gefunden.

Erstellen Sie einen benutzerdefinierten LinearLayoutManager

public class CustomLinearLayoutManager extends LinearLayoutManager {
public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);

}

// it will always pass false to RecyclerView when calling "canScrollVertically()" method.
@Override
public boolean canScrollVertically() {
    return false;
}
}

Dann instanziieren Sie es so für vertikales Scrollen

CustomLinearLayoutManager customLayoutManager = new CustomLinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);

Legen Sie schließlich das benutzerdefinierte Layout als Layout-Manager der Recycler-Ansicht fest

recyclerView.setLayoutManager(customLayoutManager);
38

Es ist zwar nicht ratsam, eingebettete Recycler-Ansichten einzurichten, aber manchmal können Sie dies nicht vermeiden. So etwas könnte funktionieren:

public class NoScrollRecycler extends RecyclerView {

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

    public NoScrollRecycler(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    public NoScrollRecycler(Context context, AttributeSet attrs, int style){
        super(context, attrs, style);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev){

        //Ignore scroll events.
        if(ev.getAction() == MotionEvent.ACTION_MOVE)
            return true;

        //Dispatch event for non-scroll actions, namely clicks!
        return super.dispatchTouchEvent(ev);
    }
}

Dadurch wird das Bildlaufereignis deaktiviert, nicht jedoch die Klickereignisse. Verwenden Sie diese Klasse für das "untergeordnete" RecyclerView. Sie möchten, dass das PARENT-Recycling-Fenster einen Bildlauf durchführt, nicht jedoch das untergeordnete Element. Nun, dies sollte dies tun, da das übergeordnete Element nur die Standard-RecyclerView ist, das untergeordnete Element jedoch das benutzerdefinierte ist, das keinen Bildlauf durchführt, jedoch Klicks verarbeitet. Möglicherweise muss das Klicken für das übergeordnete RecyclerView-Symbol deaktiviert werden. Nicht sicher, da ich dies nicht getestet habe, also nur ein Beispiel betrachten ...

Um dies in XML zu verwenden (falls Sie es nicht wussten), gehen Sie folgendermaßen vor:

<com.yourpackage.location.NoScrollRecycler
     ...
     ... >

     ...
     ...

</com.yourpackage.location.NoScrollRecycler>
14
Lucas Crawford

Schreiben Sie auf Ihrer ActivityName.Java in die onCreate () - Methode:

RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);

Auf jeden Fall, wenn Sie das Koordinator-Layout verwenden, falls Sie die Dinge vereinfachen möchten und das verschachtelte Bildlauf deaktivieren möchten. 

 <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/activitiesListRV"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"/>
 </Android.support.v4.widget.NestedScrollView>

Und wieder wenden Sie dasselbe Prinzip an: Schreiben Sie in Ihre ActivityName.Java-Methode in die onCreate () - Methode:

RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);

Grundsätzlich müssen Sie in XML die App angeben: layout_behavior

app:layout_behavior="@string/appbar_scrolling_view_behavior">
13
Ibrahim Tolaj

Android:nestedScrollingEnabled="false" in der untergeordneten RecyclerView

Du kannst hinzufügen 

Android:nestedScrollingEnabled="false"

zu Ihrer RecyclerView in XML oder 

childRecyclerView.setNestedScrollingEnabled(false);

zu Ihrer RecyclerView in Java.

BEARBEITEN: -

childRecyclerView.setNestedScrollingEnabled(false); funktioniert nur bei Geräten mit Android-Version> 21. Um in allen Geräten zu arbeiten, verwenden Sie die folgenden

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
9
jafarbtech

sie können setNestedScrollingEnabled(false); für Sub RecyclerView verwenden, wodurch das Scrollen in Sub RecyclerView gestoppt wird. 

In meinem Fall war der Code

mInnerRecyclerView.setNestedScrollingEnabled(false); wobei mInnerRecyclerView inner RecyclerView ist.

2
vijay kumar

Ich habe viele Lösungsvorschläge ausprobiert und konnte keine finden, die in meinem Fall funktionierte. Ich habe mehr als 1 RecyclerView in einem ScrollView mit einem GridLayoutManager. Das Ergebnis des oben genannten Vorschlags führte dazu, dass der ScrollView-Vorgang beim Scrollen anhielt, wenn ich meinen Finger hob (er rutschte nicht nach oben oder unten in die Ansicht, als mein Finger über einen RecyclerView angehoben wurde).

Beim Durchsehen der RecyclerView-Quelle wird im onTouchEvent der Layout-Manager aufgerufen:

final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
final boolean canScrollVertically = mLayout.canScrollVertically();

Wenn Sie diese in einem benutzerdefinierten Layout-Manager überschreiben, geben Sie false zurück, und der Bildlauf wird abgebrochen. Es behebt außerdem das Problem, dass der ScrollView abrupt abbricht.

1
Aidanvii
 <RelativeLayout
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content">
            <Android.support.v7.widget.RecyclerView
                Android:id="@+id/rv"
                Android:layout_marginTop="2dp"
                Android:layout_marginLeft="2dp"
                Android:layout_marginBottom="10dp"
                Android:layout_marginRight="2dp"
                Android:nestedScrollingEnabled="false"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                />
                </RelativeLayout>

setzen Sie den Code in das Linner-Layout ein ... Sie müssen nichts Pragmatisches tun

1
sunil rana

Ich denke ich bin zu spät, aber hier habe ich die Lösung gefunden, wenn es jemanden noch nervt: 

    RecyclerView v = (RecyclerView); 
    findViewById(R.id.your_recycler_view_id);
    v.setNestedScrollingEnabled(false);
    sensorsRecyclerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent    event) {
            return true;
        }
    });
0
Waged

Wenn Sie keine benutzerdefinierte Ansicht erstellen möchten, besteht eine weitere Option darin, vor der RecyclerView ein Layout derselben Größe zu erstellen und anklickbar zu machen.

BEARBEITEN: Leider werden auch Ereignisse für Listenelemente blockiert.

0
KinoP