2017-10-15 4 views

Répondre

1
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) { 
      return 1; 
     } 
    }; 

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
    itemTouchHelper.attachToRecyclerView(recyclerView); 

La partie clé ici est la méthode getSwipeThreshold .

----------------------------------
EDIT: En fait, il y a mais comme j'ai eu une mauvaise réponse ici, j'ai décidé d'éditer mon post et de mettre en œuvre quelque chose de très similaire à il.

Il existe d'autres méthodes à remplacer en plus de ce qui est mentionné et des champs à ajouter dans la classe ItemTouchHelper.SimpleCallback.

Domaines:

 private final float stopPoint = 200;    // The point where items stop when move past it 
     private final float swipeStopFraction = 0.002f;  // higher means items stop sooner when swiped 
     private final float swipeSpeedFraction = 0.8f;  // lower means items move slower when swiped 

     private float prevA = 1; 
     private float a = 1; 

     private float prevDX; 
     private float backDX; 

     private boolean leftLock = false; 
     private boolean rightLock = false; 
     private boolean leftExpanded = false; 
     private boolean rightExpanded = false; 

     private CustomRecyclerViewAdapter.CustomViewHolder prevHolder; 

Autres méthodes:

 @Override 
     public float getSwipeVelocityThreshold(float defaultValue) { 
      return 0; 
     } 

     @Override 
     public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 
      final CustomRecyclerViewAdapter.CustomViewHolder holder = (CustomRecyclerViewAdapter.CustomViewHolder) viewHolder; 
      prevHolder = holder; 

      dX *= swipeSpeedFraction; 

      if (!isCurrentlyActive) { 
       if (!leftLock) { 
        leftExpanded = false; 
       } 
       if (!rightLock) { 
        rightExpanded = false; 
       } 
       a = 0; 
      } 

      if (isCurrentlyActive) { 
       if (dX > 0 && !rightExpanded) { 
        leftExpanded = true; 
       } 
       if (dX < 0 && !leftExpanded) { 
        rightExpanded = true; 
       } 
      } 

      float cachedDX = dX; 
      if (a == 0) { 
       if (dX/prevA > stopPoint && !rightExpanded && backDX == 0) { 
        leftLock = true; 
        leftExpanded = true; 
       } 
       if (dX/prevA < -stopPoint && !leftExpanded && backDX == 0) { 
        rightLock = true; 
        rightExpanded = true; 
       } 
       if (backDX != 0) { 
        dX += backDX - dX; 
        backDX /= 2; 
       } else { 
        dX /= prevA; 
       } 
       a = 1; 
      } else if (dX == 0) { 
       backDX = 0; 
      } else if (dX > 0) { 
       if (leftExpanded) { 
        if (backDX != 0) { 
         leftLock = true; 
        } 
        dX /= a; 
        prevA = a; 
        a += swipeStopFraction * (cachedDX - prevDX); 
       } else { 
        dX = - stopPoint + dX; 
        if (backDX > 0) { 
         a += 0.01 * (cachedDX - prevDX); 
        } 
        dX /= a; 
        backDX = dX; 
        rightLock = false; 
       } 
      } else if (dX < 0) { 
       if (rightExpanded) { 
        if (backDX != 0) { 
         rightLock = true; 
        } 
        dX /= a; 
        prevA = a; 
        a -= swipeStopFraction * (cachedDX - prevDX); 
       } else { 
        dX = stopPoint + dX; 
        if (backDX < 0) { 
         a -= 0.01 * (cachedDX - prevDX); 
        } 
        dX /= a; 
        prevA = a; 
        backDX = dX; 
        leftLock = false; 
       } 
      } 
      prevDX = cachedDX; 

      if (leftLock) { 
       if (dX < stopPoint) { 
        dX = stopPoint; 
       } 
      } 

      if (rightLock) { 
       if (dX > -stopPoint) { 
        dX = -stopPoint; 
       } 
      } 

      // Below lines provide background for the empty area when the item is swiped. 
      // Container could be any layout that is the root layout if the item 
      final Paint paint = new Paint(); 
      paint.setColor(getResources().getColor(R.color.colorAccent)); 
      if (dX > 0) { 
       c.drawRect(holder.container.getLeft(), holder.container.getTop(), dX, holder.container.getBottom(), paint); 
      } else { 
       c.drawRect(holder.container.getRight() + dX, holder.container.getTop(), holder.container.getRight(), holder.container.getBottom(), paint); 
      } 


      super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
     } 

     @Override 
     public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 
      super.onSelectedChanged(viewHolder, actionState); 

      if (prevHolder != null && viewHolder != null && prevHolder != viewHolder) { 
       leftLock = false; 
       rightLock = false; 
       leftExpanded = false; 
       rightExpanded = false; 
       prevHolder.container.setTranslationX(0); // Container could be any layout that is the root layout if the item 
      } 

     } 

Le contrôle sur ce qui se passe dans une vue recycleur est très limité et je ne pouvais pas pousser plus loin. J'espère que cela pourrait être utile.

Personnellement, je pense que faire cela avec ItemTouchHelper est très difficile à implémenter et à gérer et le résultat ne serait pas acceptable.

+0

Vous n'avez probablement pas eu ma question. Ce code vous fait simplement glisser plus vers l'élément considéré comme balayé. –

+0

Oui, vous avez raison @HugoCastelani, de toute façon j'ai essayé d'ajouter quelques changements pour produire l'effet le plus proche de ce que vous avez demandé, mais je n'ai pas réussi à le faire exactement comme votre exemple. –

+0

Fonctionne encore mieux que je pensais que ça allait. Je vous remercie! –