Ich verwende recyclerview 22.2.0 und die Hilfsklasse ItemTouchHelper.SimpleCallback zu ermöglichen Swipe-to-abtun Option meiner Liste. Da ich jedoch eine Art Header habe, muss ich das Wischverhalten für die erste Position des Adapters deaktivieren. Da RecyclerView.Adapter keine isEnabled () -Methode hat, habe ich versucht, die Ansichtsinteraktion über die Methoden isEnabled () und isFocusable () in der ViewHolder-Erstellung selbst zu deaktivieren , hatte jedoch keinen Erfolg. Ich versuchte , die Swipe - Schwelle auf einen vollen Wert, wie anzupassen 0f ot 1f in dem SimpleCallback Methode getSwipeThreshold () , aber ohne Erfolg zu.
Einige Fragmente meines Codes sollen Ihnen helfen, mir zu helfen.
Meine Aktivität:
@Override
protected void onCreate(Bundle bundle) {
//... initialization
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
return false;
}
@Override
public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof CartAdapter.MyViewHolder) return 1f;
return super.getSwipeThreshold(viewHolder);
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}
Und ich habe einen gemeinsamen Adapter mit zwei Ansichtstypen. In dem ViewHolder , in dem ich das Wischen deaktivieren möchte, habe ich Folgendes getan:
public static class MyViewHolder extends RecyclerView.ViewHolder {
public ViewGroup mContainer;
public MyViewHolder(View v) {
super(v);
v.setFocusable(false);
v.setEnabled(false);
mContainer = (ViewGroup) v.findViewById(R.id.container);
}
}
quelle
SimpleCallback
developer.android.com/intl/pt-br/reference/android/support/v7/… vorhandenreturn position == 0 ? ItemTouchHelper.LEFT : super.getSwipeDirs(recyclerView, viewHolder);
diese - dh nur für linke Wischbewegungen.Wenn jemand ItemTouchHelper.Callback verwendet . Anschließend können Sie alle zugehörigen Flags in der Funktion getMovementFlags (..) entfernen .
Hier können Sie anstelle von dragFlags und swipeFlags 0 übergeben, um die entsprechende Funktion zu deaktivieren.
ItemTouchHelper.START bedeutet, dass bei einem Gebietsschema von links nach rechts (Unterstützung für LTR-Anwendungen) von links nach rechts gewischt wird, bei einem Gebietsschema von rechts nach links umgekehrt (Unterstützung für RTL-Anwendungen). ItemTouchHelper.END bedeutet Wischen in die entgegengesetzte Richtung von
START
.So können Sie jede Flagge entsprechend Ihren Anforderungen entfernen.
quelle
ItemTouchHelper.Callback
direkt erweitern.Hier ist eine einfache Möglichkeit, die nur von der Position des zu wischenden Elements abhängt:
Dies sollte auch funktionieren, wenn Sie Folgendes verwenden
SimpleCallback
:Wenn Sie das Wischen abhängig von den Daten im Element deaktivieren möchten, verwenden Sie den
position
Wert, um Daten vom Adapter für das zu wischende Element abzurufen, und deaktivieren Sie es entsprechend.Wenn Sie bereits bestimmte Haltertypen haben, die nicht gewischt werden müssen, funktioniert die akzeptierte Antwort. Das Erstellen von Haltertypen als Stellvertreter für die Position ist jedoch ein Problem und sollte vermieden werden.
quelle
Es gibt einige Möglichkeiten, dies zu tun. Wenn Sie jedoch nur einen ViewHolder, aber mehr als ein Layout haben, können Sie diesen Ansatz wählen.
Überschreiben Sie den getItemViewType und geben Sie ihm eine Logik, um den Ansichtstyp basierend auf der Position oder dem Datentyp im Objekt zu bestimmen (ich habe eine getType-Funktion in meinem Objekt).
Geben Sie das richtige Layout in onCreateView basierend auf ViewType zurück (Stellen Sie sicher, dass Sie den Ansichtstyp an die ViewHolder-Klasse übergeben.
Abrufen der Inhaltsansichten der verschiedenen Layouts basierend auf dem Ansichtstyp öffentliche statische Klasse AppListItemHolder erweitert RecyclerView.ViewHolder {
Ändern Sie dann in Ihrem ItemTouchHelper die Aktionen basierend auf ViewType. Für mich deaktiviert dies das Wischen eines RecyclerView-Abschnittsheaders
quelle
Legen Sie zunächst in recyclerView bei der onCreateViewHolder-Methode das Tag für jeden viewHolder-Typ fest, wie im folgenden Code angegeben:
Aktualisieren Sie dann in der Implementierung von ItemTouchHelper.Callback die Methode getMovementFlags wie folgt:
am Ende an recyclerView anhängen:
quelle
Zusätzlich zur Antwort von @Rafael Toledo: Wenn Sie die spezifische Wischgeste wie LINKS oder RECHTS basierend auf der Position oder dem Datentyp im Objekt im Adapter entfernen möchten, können Sie dies tun.
Hier in meinem Fall lade ich in meinem Recyclerview die Chat-Konversationen und es gibt RECHTS- (für ARCHIV) und LINKS- (für EXIT) Wischgesten für jedes Element. Falls die Konversation jedoch nicht aktiv ist, muss ich das RECHTE Wischen für das bestimmte Element in der Recycler-Ansicht deaktivieren.
Also überprüfe ich das
activeChat
und dementsprechend und deaktiviere das RECHTE Wischen.quelle
Es kann mit deaktiviert werden
ItemTouchHelper.ACTION_STATE_IDLE
quelle