hereからカスタムビューを入れているうちに、いくつかの問題に気付きました。RecyclerView onSwipedが計画どおりに動作していない
- 項目がクリアされないため、画面から外に出ると、その代わりにすき間が残されます。
- スワイプされていても完全ではない場合でも、アラームアイコンは画面に表示されます。
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();
}
}
はどのようになります。
は、ビットマップが更新以下のようにアイテムをフェードアウトしてください隙間を埋めるために
は、私はあなたが提供することができます任意のソリューションのために感謝される私の問題を解決し、
私の血圧を下げる
UPDATE:私はアイコンの問題は非常に愚かだった固定
方法。 if (dX > 0)
の後のelse
文では、else if (dX < 0)
に置き換えられ、アイコンが消えました。私の理論は、これは、RVアイテムが置き換えられたときにdXが0より大きくないため、else
ステートメントが呼び出され、アイコンが再び描画されるからです。