Fancy drag/swipe effect
This commit is contained in:
parent
47886205f6
commit
8286a76cdf
|
@ -5,6 +5,7 @@ import android.graphics.drawable.Drawable;
|
|||
import android.net.Uri;
|
||||
import android.support.v7.widget.PopupMenu;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.Log;
|
||||
import android.view.ContextMenu;
|
||||
|
@ -24,6 +25,7 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
|||
import com.bumptech.glide.request.animation.GlideAnimation;
|
||||
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
|
||||
import com.joanzapata.iconify.Iconify;
|
||||
import com.nineoldandroids.view.ViewHelper;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
|
@ -250,7 +252,9 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
|
|||
};
|
||||
|
||||
public class Holder extends RecyclerView.ViewHolder
|
||||
implements View.OnClickListener, View.OnCreateContextMenuListener {
|
||||
implements View.OnClickListener,
|
||||
View.OnCreateContextMenuListener,
|
||||
ItemTouchHelperViewHolder {
|
||||
TextView placeholder;
|
||||
TextView title;
|
||||
TextView pubDate;
|
||||
|
@ -278,6 +282,16 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemSelected() {
|
||||
ViewHelper.setAlpha(itemView, 0.5f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClear() {
|
||||
ViewHelper.setAlpha(itemView, 1.0f);
|
||||
}
|
||||
|
||||
public FeedItem getFeedItem() { return item; }
|
||||
|
||||
@Override
|
||||
|
@ -317,4 +331,26 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
|
|||
boolean isInQueue(FeedItem item);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies a View Holder of relevant callbacks from
|
||||
* {@link ItemTouchHelper.Callback}.
|
||||
*/
|
||||
public interface ItemTouchHelperViewHolder {
|
||||
|
||||
/**
|
||||
* Called when the {@link ItemTouchHelper} first registers an
|
||||
* item as being moved or swiped.
|
||||
* Implementations should update the item view to indicate
|
||||
* it's active state.
|
||||
*/
|
||||
void onItemSelected();
|
||||
|
||||
|
||||
/**
|
||||
* Called when the {@link ItemTouchHelper} has completed the
|
||||
* move or swipe, and the active item state should be cleared.
|
||||
*/
|
||||
void onItemClear();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
|||
import com.bumptech.glide.request.animation.GlideAnimation;
|
||||
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
|
||||
import com.joanzapata.iconify.Iconify;
|
||||
import com.nineoldandroids.view.ViewHelper;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
|
@ -101,7 +102,9 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
|
|||
}
|
||||
|
||||
public class ViewHolder extends RecyclerView.ViewHolder
|
||||
implements View.OnClickListener, View.OnCreateContextMenuListener {
|
||||
implements View.OnClickListener,
|
||||
View.OnCreateContextMenuListener,
|
||||
ItemTouchHelperViewHolder {
|
||||
|
||||
private final ImageView dragHandle;
|
||||
private final TextView placeholder;
|
||||
|
@ -170,6 +173,16 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
|
|||
itemAccess.getQueueIds());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemSelected() {
|
||||
ViewHelper.setAlpha(itemView, 0.5f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClear() {
|
||||
ViewHelper.setAlpha(itemView, 1.0f);
|
||||
}
|
||||
|
||||
public void bind(FeedItem item) {
|
||||
this.item = item;
|
||||
if(locked) {
|
||||
|
@ -248,6 +261,8 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
|
|||
.dontAnimate()
|
||||
.into(new CoverTarget(item.getFeed().getImageUri(), placeholder, cover));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -306,4 +321,26 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
|
|||
int getItemDownloadProgressPercent(FeedItem item);
|
||||
LongList getQueueIds();
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies a View Holder of relevant callbacks from
|
||||
* {@link ItemTouchHelper.Callback}.
|
||||
*/
|
||||
public interface ItemTouchHelperViewHolder {
|
||||
|
||||
/**
|
||||
* Called when the {@link ItemTouchHelper} first registers an
|
||||
* item as being moved or swiped.
|
||||
* Implementations should update the item view to indicate
|
||||
* it's active state.
|
||||
*/
|
||||
void onItemSelected();
|
||||
|
||||
|
||||
/**
|
||||
* Called when the {@link ItemTouchHelper} has completed the
|
||||
* move or swipe, and the active item state should be cleared.
|
||||
*/
|
||||
void onItemClear();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import java.util.List;
|
|||
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.adapter.AllEpisodesRecycleAdapter;
|
||||
import de.danoeh.antennapod.adapter.QueueRecyclerAdapter;
|
||||
import de.danoeh.antennapod.core.event.QueueEvent;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
|
@ -104,6 +105,32 @@ public class NewEpisodesFragment extends AllEpisodesFragment {
|
|||
snackbar.show();
|
||||
h.postDelayed(r, (int)Math.ceil(snackbar.getDuration() * 1.05f));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
|
||||
int actionState) {
|
||||
// We only want the active item
|
||||
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
|
||||
if (viewHolder instanceof AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) {
|
||||
AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder itemViewHolder =
|
||||
(AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) viewHolder;
|
||||
itemViewHolder.onItemSelected();
|
||||
}
|
||||
}
|
||||
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
}
|
||||
@Override
|
||||
public void clearView(RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(recyclerView, viewHolder);
|
||||
|
||||
if (viewHolder instanceof AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) {
|
||||
AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder itemViewHolder =
|
||||
(AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) viewHolder;
|
||||
itemViewHolder.onItemClear();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
|
||||
|
|
|
@ -402,6 +402,32 @@ public class QueueFragment extends Fragment {
|
|||
public boolean isItemViewSwipeEnabled() {
|
||||
return false == UserPreferences.isQueueLocked();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
|
||||
int actionState) {
|
||||
// We only want the active item
|
||||
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
|
||||
if (viewHolder instanceof QueueRecyclerAdapter.ItemTouchHelperViewHolder) {
|
||||
QueueRecyclerAdapter.ItemTouchHelperViewHolder itemViewHolder =
|
||||
(QueueRecyclerAdapter.ItemTouchHelperViewHolder) viewHolder;
|
||||
itemViewHolder.onItemSelected();
|
||||
}
|
||||
}
|
||||
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
}
|
||||
@Override
|
||||
public void clearView(RecyclerView recyclerView,
|
||||
RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(recyclerView, viewHolder);
|
||||
|
||||
if (viewHolder instanceof QueueRecyclerAdapter.ItemTouchHelperViewHolder) {
|
||||
QueueRecyclerAdapter.ItemTouchHelperViewHolder itemViewHolder =
|
||||
(QueueRecyclerAdapter.ItemTouchHelperViewHolder) viewHolder;
|
||||
itemViewHolder.onItemClear();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
itemTouchHelper.attachToRecyclerView(recyclerView);
|
||||
|
|
Loading…
Reference in New Issue