Java tutorial
/* * Copyright (C) 2015 Haruki Hasegawa * * 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. */ package com.duanyl.recyclerviewsd; import android.support.v4.view.ViewCompat; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter; import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange; import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager; import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager; import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemAdapter; import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractDraggableSwipeableItemViewHolder; public class MyDraggableSwipeableItemAdapter extends RecyclerView.Adapter<MyDraggableSwipeableItemAdapter.MyViewHolder> implements DraggableItemAdapter<MyDraggableSwipeableItemAdapter.MyViewHolder>, SwipeableItemAdapter<MyDraggableSwipeableItemAdapter.MyViewHolder> { private static final String TAG = "MyDSItemAdapter"; private AbstractDataProvider mProvider; private EventListener mEventListener; private View.OnClickListener mItemViewOnClickListener; private View.OnClickListener mSwipeableViewContainerOnClickListener; public interface EventListener { void onItemRemoved(int position); void onItemPinned(int position); void onItemViewClicked(View v, boolean pinned); } public static class MyViewHolder extends AbstractDraggableSwipeableItemViewHolder { public ViewGroup mContainer; public View mDragHandle; public TextView mTextView; public MyViewHolder(View v) { super(v); mContainer = (ViewGroup) v.findViewById(R.id.container); mDragHandle = v.findViewById(R.id.drag_handle); mTextView = (TextView) v.findViewById(android.R.id.text1); } @Override public View getSwipeableContainerView() { return mContainer; } } public MyDraggableSwipeableItemAdapter(AbstractDataProvider dataProvider) { mProvider = dataProvider; mItemViewOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { onItemViewClick(v); } }; mSwipeableViewContainerOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { onSwipeableViewContainerClick(v); } }; // DraggableItemAdapter and SwipeableItemAdapter require stable ID, and also // have to implement the getItemId() method appropriately. setHasStableIds(true); } private void onItemViewClick(View v) { if (mEventListener != null) { mEventListener.onItemViewClicked(v, true); // true --- pinned } } private void onSwipeableViewContainerClick(View v) { if (mEventListener != null) { mEventListener.onItemViewClicked(AdapterUtils.findParentViewHolderItemView(v), false); // false --- not pinned } } @Override public long getItemId(int position) { return mProvider.getItem(position).getId(); } @Override public int getItemViewType(int position) { return mProvider.getItem(position).getViewType(); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final View v = inflater.inflate((viewType == 0) ? R.layout.list_item : R.layout.list_item2, parent, false); return new MyViewHolder(v); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { final AbstractDataProvider.Data item = mProvider.getItem(position); // set listeners // (if the item is *not pinned*, click event comes to the itemView) holder.itemView.setOnClickListener(mItemViewOnClickListener); // (if the item is *pinned*, click event comes to the mContainer) holder.mContainer.setOnClickListener(mSwipeableViewContainerOnClickListener); // set text holder.mTextView.setText(item.getText()); // set background resource (target view ID: container) final int dragState = holder.getDragStateFlags(); final int swipeState = holder.getSwipeStateFlags(); if (((dragState & RecyclerViewDragDropManager.STATE_FLAG_IS_UPDATED) != 0) || ((swipeState & RecyclerViewSwipeManager.STATE_FLAG_IS_UPDATED) != 0)) { int bgResId; if ((dragState & RecyclerViewDragDropManager.STATE_FLAG_IS_ACTIVE) != 0) { bgResId = R.drawable.bg_item_dragging_active_state; } else if ((dragState & RecyclerViewDragDropManager.STATE_FLAG_DRAGGING) != 0) { bgResId = R.drawable.bg_item_dragging_state; } else if ((swipeState & RecyclerViewSwipeManager.STATE_FLAG_IS_ACTIVE) != 0) { bgResId = R.drawable.bg_item_swiping_active_state; } else if ((swipeState & RecyclerViewSwipeManager.STATE_FLAG_SWIPING) != 0) { bgResId = R.drawable.bg_item_swiping_state; } else { bgResId = R.drawable.bg_item_normal_state; } holder.mContainer.setBackgroundResource(bgResId); } // set swiping properties holder.setSwipeItemSlideAmount( item.isPinnedToSwipeLeft() ? RecyclerViewSwipeManager.OUTSIDE_OF_THE_WINDOW_LEFT : 0); } @Override public int getItemCount() { return mProvider.getCount(); } @Override public void onMoveItem(int fromPosition, int toPosition) { Log.d(TAG, "onMoveItem(fromPosition = " + fromPosition + ", toPosition = " + toPosition + ")"); if (fromPosition == toPosition) { return; } mProvider.moveItem(fromPosition, toPosition); notifyItemMoved(fromPosition, toPosition); } @Override public boolean onCheckCanStartDrag(MyViewHolder holder, int x, int y) { // x, y --- relative from the itemView's top-left final View containerView = holder.mContainer; final View dragHandleView = holder.mDragHandle; /** * 1.view.getTranslationXview0 2.view.getXviewgetLeft+getTranslationX */ final int offsetX = containerView.getLeft() + (int) (ViewCompat.getTranslationX(containerView) + 0.5f); final int offsetY = containerView.getTop() + (int) (ViewCompat.getTranslationY(containerView) + 0.5f); return ViewUtils.hitTest(dragHandleView, x - offsetX, y - offsetY); } @Override public ItemDraggableRange onGetItemDraggableRange(MyViewHolder holder) { // no drag-sortable range specified return null; } @Override public int onGetSwipeReactionType(MyViewHolder holder, int x, int y) { if (onCheckCanStartDrag(holder, x, y)) { return RecyclerViewSwipeManager.REACTION_CAN_NOT_SWIPE_BOTH; } else { return mProvider.getItem(holder.getPosition()).getSwipeReactionType(); } } @Override public void onSetSwipeBackground(MyViewHolder holder, int type) { int bgRes = 0; switch (type) { case RecyclerViewSwipeManager.DRAWABLE_SWIPE_NEUTRAL_BACKGROUND: bgRes = R.drawable.bg_swipe_item_neutral; break; case RecyclerViewSwipeManager.DRAWABLE_SWIPE_LEFT_BACKGROUND: bgRes = R.drawable.bg_swipe_item_left; break; case RecyclerViewSwipeManager.DRAWABLE_SWIPE_RIGHT_BACKGROUND: bgRes = R.drawable.bg_swipe_item_right; break; } holder.itemView.setBackgroundResource(bgRes); } @Override public int onSwipeItem(MyViewHolder holder, int result) { Log.d(TAG, "onSwipeItem(result = " + result + ")"); switch (result) { // swipe right --- remove case RecyclerViewSwipeManager.RESULT_SWIPED_RIGHT: return RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_REMOVE_ITEM; // swipe left -- pin case RecyclerViewSwipeManager.RESULT_SWIPED_LEFT: return RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_MOVE_TO_SWIPED_DIRECTION; // other --- do nothing case RecyclerViewSwipeManager.RESULT_CANCELED: default: return RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_DEFAULT; } } @Override public void onPerformAfterSwipeReaction(MyViewHolder holder, int result, int reaction) { Log.d(TAG, "onPerformAfterSwipeReaction(result = " + result + ", reaction = " + reaction + ")"); final int position = holder.getPosition(); final AbstractDataProvider.Data item = mProvider.getItem(position); if (reaction == RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_REMOVE_ITEM) { mProvider.removeItem(position); notifyItemRemoved(position); if (mEventListener != null) { mEventListener.onItemRemoved(position); } } else if (reaction == RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_MOVE_TO_SWIPED_DIRECTION) { item.setPinnedToSwipeLeft(true); notifyItemChanged(position); if (mEventListener != null) { mEventListener.onItemPinned(position); } } else { item.setPinnedToSwipeLeft(false); } } public EventListener getEventListener() { return mEventListener; } public void setEventListener(EventListener eventListener) { mEventListener = eventListener; } }