2016-03-25 3 views
2

Ich habe eine Recycler-Ansicht mit ItemTouchHelper. Es ermöglicht das Ziehen der Elemente.ItemTouchHelper: Verhindern Sie das Ziehen außerhalb der Grenzen

Ich möchte das Ziehen auf die Grenzen der Recycler-Ansicht beschränken - d. H. Sie können die Ansicht nicht einfach außerhalb des Containers ziehen, sodass sie verschwindet.

Ich habe versucht, die absoluten Koordinaten wie diese Überprüfung:

@Override 
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 
     recyclerView.getLocationOnScreen(pos); 
     int rvY = pos[1]; 
     viewHolder.itemView.getLocationOnScreen(pos); 
     int vhY = pos[1]; 


     if (rvY > vhY || rvY + recyclerView.getHeight() < vhY + viewHolder.itemView.getHeight()) { 
      return; 
     } 
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
... 
} 

aber dann laufe ich in irgendwie Rendering concurency - wenn ich den Blick langsam bewegen, wird es in Bewegung zu stoppen, wenn außerhalb der Grenzen zu gehen, aber wenn ich umziehe schneller - dann verlässt es sowieso die Grenzen des Recyclers.

Irgendwelche Ideen/Ansätze?

+0

Sie dies schließlich lösen haben? – Frank

Antwort

2

Der dY Wert muss auf die Recycler Ansichten Grenzen abgeschnitten:

@Override 
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) 
{ 
    float topY = viewHolder.itemView.getTop() + dY; 
    float bottomY = topY + viewHolder.itemView.getHeight(); 
    if (topY < 0) 
    { 
     dY = 0; 
    } 
    else if (bottomY > recyclerView.getHeight()) 
    { 
     dY = recyclerView.getHeight() - viewHolder.itemView.getHeight() - viewHolder.itemView.getTop(); 
    } 
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
} 
Verwandte Themen