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?
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);
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>
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">
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);
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.
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.
<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
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;
}
});
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.