2016-04-29 16 views
0

hereからカスタムビューを入れているうちに、いくつかの問題に気付きました。RecyclerView onSwipedが計画どおりに動作していない

  • 項目がクリアされないため、画面から外に出ると、その代わりにすき間が残されます。
  • スワイプされていても完全ではない場合でも、アラームアイコンは画面に表示されます。

ここでは私の苦境のスクリーンショットです: bugs bugs everywhere

ItemTouchHelperCallback:

@Override 
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 
    View itemView = viewHolder.itemView; 
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { 
     itemView = viewHolder.itemView; 
     float height = (float) itemView.getBottom() - (float) itemView.getTop(); 
     float width = height/3; 

     // First, a rectangle is drawn on Canvas which covers the whole item view in preferred color. 
     // Then, we draw a Bitmap icon over that in specified location. 
     // Swiped right, green background with tick icon 
     // Swiped left, Orange background with alarm clock. 
     if(dX > 0){ 
      // On the left side i.e swiped right 
      p.setColor(ContextCompat.getColor(context, R.color.green)); 

      // Draw Rect with varying right side, equal to displacement dX 
      RectF background = new RectF((float) itemView.getLeft(), (float) itemView.getTop(), dX,(float) itemView.getBottom()); 
      c.drawRect(background,p); 

      // Retrieves icon as Bitmap 
      icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_tick); 
      RectF icon_dest = new RectF((float) itemView.getLeft() + width ,(float) itemView.getTop() + width,(float) itemView.getLeft()+ 2*width,(float)itemView.getBottom() - width); 

      // Set the image icon for Right swipe 
      c.drawBitmap(icon,null,icon_dest,p); 
     } else { 
      // On the right side i.e swiped left 
      p.setColor(ContextCompat.getColor(context, R.color.orange)); 

      // Draw Rect with varying left side, equal to the item's right side 
      // plus negative displacement dX 
      RectF background = new RectF((float) itemView.getRight() + dX, (float) itemView.getTop(),(float) itemView.getRight(), (float) itemView.getBottom()); 
      c.drawRect(background,p); 

      // Retrieves icon as Bitmap 
      icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_alarm_off); 
      RectF icon_dest = new RectF((float) itemView.getRight() - 2*width ,(float) itemView.getTop() + width,(float) itemView.getRight() - width,(float)itemView.getBottom() - width); 

      // Set the image icon for Left swipe 
      c.drawBitmap(icon,null,icon_dest,p); 
     } 

     // Fade out the view as it is swiped out of the parent's bounds 
     final float alpha = 1.0f - Math.abs(dX)/(float) viewHolder.itemView.getWidth(); 
     viewHolder.itemView.setAlpha(alpha); 
     viewHolder.itemView.setTranslationX(dX); 
    } 
    else 
     super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
} 

@Override 
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, 
           int actionState) { 
    // We only want the active item 
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 
     if (viewHolder instanceof ItemTouchHelperViewHolder) { 
      ItemTouchHelperViewHolder itemViewHolder = 
        (ItemTouchHelperViewHolder) viewHolder; 
      itemViewHolder.onItemSelected(); 
      viewHolder.itemView.setBackgroundColor(Color.LTGRAY); 
     } 
    } 

    super.onSelectedChanged(viewHolder, actionState); 
} 

@Override 
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
    // Called when RV item goes back into idle state i.e. finished drag or swipe 
    super.clearView(recyclerView, viewHolder); 
    if(viewHolder instanceof ItemTouchHelperViewHolder) { 
     ItemTouchHelperViewHolder itemTouchHelperViewHolder = (ItemTouchHelperViewHolder) viewHolder; 
     itemTouchHelperViewHolder.onItemClear(); 
     viewHolder.itemView.setBackgroundColor(0); 
     icon.recycle(); 
    } 
} 

はどのようになります。

  1. は、ビットマップが更新以下のようにアイテムをフェードアウトしてください隙間を埋めるために

  2. は、私はあなたが提供することができます任意のソリューションのために感謝される私の問題を解決し、

私の血圧を下げる

  • アイコンと空間問題を修正しました。

    UPDATE:私はアイコンの問題は非常に愚かだった固定

    方法。 if (dX > 0)の後のelse文では、else if (dX < 0)に置き換えられ、アイコンが消えました。私の理論は、これは、RVアイテムが置き換えられたときにdXが0より大きくないため、elseステートメントが呼び出され、アイコンが再び描画されるからです。

    答えて

    0

    アイコンの問題を修正した方法はかなりばかげていました。 if (dX > 0)の後のelse文では、else if (dX < 0)に置き換えられ、アイコンが消えました。私の理論は、これは、RVアイテムが置き換えられたときにdXが0より大きくないので、onChildDrawelseステートメントが呼び出され、アイコンが再び描画されるからです。

    関連する問題