2016-10-28 7 views
2

Ich versuche, eine Ansicht zu erstellen, die zum Löschen kopiert werden kann, aber es kann rückgängig gemacht werden. Die Elemente haben einen Hintergrund und einen Vordergrund innerhalb einer FrameView. Ich zwingende onChildDraw in ItemTouchHelper.Callback wie folgt aus:onChildDraw verursacht das Element zu blinken

@Override 
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, 
         float dX, float dY, int actionState, boolean isCurrentlyActive) { 
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { 
     if (viewHolder instanceof ItemViewHolder) { 
      ItemViewHolder holder = (ItemViewHolder) viewHolder; 

      holder.foreground.setTranslationX(dX); 
     } 
    } else { 
     super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
    } 
} 

Alles funktioniert, bis ich versuchen, die Swipe-Aktion rückgängig zu machen, basierend auf Benutzeraktionen wie folgt aus:

foreground.animate() 
      .translationX(0) 
      .setDuration(150); 

, die die aktuelle Ansicht bringt zurück zu seine Position, aber wenn der Benutzer versucht, das Objekt erneut zu wischen, wird der Hintergrund erneut angezeigt, und aus irgendeinem Grund wird onChildDraw mit dX-Parametern aufgerufen, die größer als die Breite des Bildschirms sind. Wenn Sie auf das Element tippen, wird die Hintergrundansicht für einen Sekundenbruchteil geöffnet, und der Vordergrund kann normalerweise ausgeblendet werden. Wie kann ich das beheben?

+0

haben Sie das Problem Mate behoben? –

+0

Ich habe eine Antwort hinzugefügt – tofiffe

Antwort

1

Die Lösung war getDefaultUIUtil() Funktion von ItemTouchHelper.Callback zu verwenden. Der Arbeitscode lautet wie folgt:

@Override 
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, 
         float dX, float dY, int actionState, boolean isCurrentlyActive) { 
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { 
     if (viewHolder instanceof TrackerListAdapter.ItemViewHolder) { 
      TrackerListAdapter.ItemViewHolder holder = 
        (TrackerListAdapter.ItemViewHolder) viewHolder; 

      getDefaultUIUtil().onDraw(c, recyclerView, holder.foreground, dX, dY, actionState, isCurrentlyActive); 
     } 
    } else { 
     super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
    } 
} 
Verwandte Themen