127 lines
4.9 KiB
Java
127 lines
4.9 KiB
Java
package app.fedilab.android.helper.itemtouchhelper;
|
|
|
|
/*
|
|
* Copyright (C) 2015 Paul Burke
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
|
|
import android.graphics.Canvas;
|
|
|
|
import androidx.recyclerview.widget.GridLayoutManager;
|
|
import androidx.recyclerview.widget.ItemTouchHelper;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
/**
|
|
* An implementation of {@link ItemTouchHelper.Callback} that enables basic drag & drop and
|
|
* swipe-to-dismiss. Drag events are automatically started by an item long-press.<br/>
|
|
* </br/>
|
|
* Expects the <code>RecyclerView.Adapter</code> to listen for {@link
|
|
* ItemTouchHelperAdapter} callbacks and the <code>RecyclerView.ViewHolder</code> to implement
|
|
* {@link ItemTouchHelperViewHolder}.
|
|
*
|
|
* @author Paul Burke (ipaulpro)
|
|
*/
|
|
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
|
|
|
|
private static final float ALPHA_FULL = 1.0f;
|
|
|
|
private final ItemTouchHelperAdapter mAdapter;
|
|
|
|
public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
|
|
mAdapter = adapter;
|
|
}
|
|
|
|
@Override
|
|
public boolean isLongPressDragEnabled() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean isItemViewSwipeEnabled() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public int getMovementFlags(@NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder viewHolder) {
|
|
// Set movement flags based on the layout manager
|
|
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
|
|
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
|
|
final int swipeFlags = 0;
|
|
return makeMovementFlags(dragFlags, swipeFlags);
|
|
} else {
|
|
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
|
|
final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
|
|
return makeMovementFlags(dragFlags, swipeFlags);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean onMove(@NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder source, @NotNull RecyclerView.ViewHolder target) {
|
|
if (source.getItemViewType() != target.getItemViewType()) {
|
|
return false;
|
|
}
|
|
|
|
// Notify the adapter of the move
|
|
mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void onSwiped(@NotNull RecyclerView.ViewHolder viewHolder, int i) {
|
|
// Notify the adapter of the dismissal
|
|
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
|
|
}
|
|
|
|
@Override
|
|
public void onChildDraw(@NotNull Canvas c, @NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
|
|
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
|
|
// Fade out the view as it is swiped out of the parent's bounds
|
|
final float alpha = ALPHA_FULL - 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 to change
|
|
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
|
|
if (viewHolder instanceof ItemTouchHelperViewHolder) {
|
|
// Let the view holder know that this item is being moved or dragged
|
|
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
|
|
itemViewHolder.onItemSelected();
|
|
}
|
|
}
|
|
|
|
super.onSelectedChanged(viewHolder, actionState);
|
|
}
|
|
|
|
@Override
|
|
public void clearView(@NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder viewHolder) {
|
|
super.clearView(recyclerView, viewHolder);
|
|
|
|
viewHolder.itemView.setAlpha(ALPHA_FULL);
|
|
|
|
if (viewHolder instanceof ItemTouchHelperViewHolder) {
|
|
// Tell the view holder it's time to restore the idle state
|
|
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
|
|
itemViewHolder.onItemClear();
|
|
}
|
|
}
|
|
} |