Java tutorial
package app.hanks.com.testadvancerecyclerview; /* * 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. */ 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; import java.util.List; public class MyDraggableSwipeableItemAdapter extends RecyclerView.Adapter<MyDraggableSwipeableItemAdapter.MyViewHolder> implements DraggableItemAdapter<MyDraggableSwipeableItemAdapter.MyViewHolder>, SwipeableItemAdapter<MyDraggableSwipeableItemAdapter.MyViewHolder> { private static final String TAG = "MyDSItemAdapter"; private List<MyItem> mProvider; private View.OnClickListener mItemViewOnClickListener; private View.OnClickListener mSwipeableViewContainerOnClickListener; 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(R.id.text); } @Override public View getSwipeableContainerView() { return mContainer; } } public MyDraggableSwipeableItemAdapter(List<MyItem> 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); } @Override public long getItemId(int position) { return mProvider.get(position).getId(); } @Override public int getItemViewType(int position) { return mProvider.get(position).getViewType(); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final View v = inflater.inflate(R.layout.item_list_swipe, parent, false); return new MyViewHolder(v); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { final MyItem item = mProvider.get(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.getContent()); // 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.isPinedToSwipeLeft() ? RecyclerViewSwipeManager.OUTSIDE_OF_THE_WINDOW_LEFT : 0); } @Override public int getItemCount() { return mProvider.size(); } @Override public void onMoveItem(int fromPosition, int toPosition) { Log.d(TAG, "onMoveItem(fromPosition = " + fromPosition + ", toPosition = " + toPosition + ")"); if (fromPosition == toPosition) { return; } moveItem(fromPosition, toPosition); notifyItemMoved(fromPosition, toPosition); } private void moveItem(int fromPosition, int toPosition) { if (fromPosition == toPosition) { return; } final MyItem item = mProvider.remove(fromPosition); mProvider.add(toPosition, item); } @Override public boolean onCheckCanStartDrag(MyViewHolder holder, int position, int x, int y) { // x, y --- relative from the itemView's top-left final View containerView = holder.mContainer; final View dragHandleView = holder.mDragHandle; final int offsetX = containerView.getLeft() + (int) (ViewCompat.getTranslationX(containerView) + 0.5f); final int offsetY = containerView.getTop() + (int) (ViewCompat.getTranslationY(containerView) + 0.5f); return hitTest(dragHandleView, x - offsetX, y - offsetY); } public static boolean hitTest(View v, int x, int y) { final int tx = (int) (ViewCompat.getTranslationX(v) + 0.5f); final int ty = (int) (ViewCompat.getTranslationY(v) + 0.5f); final int left = v.getLeft() + tx; final int right = v.getRight() + tx; final int top = v.getTop() + ty; final int bottom = v.getBottom() + ty; return (x >= left) && (x <= right) && (y >= top) && (y <= bottom); } @Override public ItemDraggableRange onGetItemDraggableRange(MyViewHolder holder, int position) { // no drag-sortable range specified return null; } @Override public int onGetSwipeReactionType(MyViewHolder holder, int position, int x, int y) { if (onCheckCanStartDrag(holder, position, x, y)) { return RecyclerViewSwipeManager.REACTION_CAN_NOT_SWIPE_BOTH; } else { return RecyclerViewSwipeManager.REACTION_CAN_SWIPE_BOTH; } } @Override public void onSetSwipeBackground(MyViewHolder holder, int position, 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 position, int result) { Log.d(TAG, "onSwipeItem(result = " + result + ")"); switch (result) { // swipe right case RecyclerViewSwipeManager.RESULT_SWIPED_RIGHT: if (mProvider.get(position).isPinedToSwipeLeft()) { // pinned --- back to default position return RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_DEFAULT; } else { // not pinned --- remove 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 position, int result, int reaction) { Log.d(TAG, "onPerformAfterSwipeReaction(result = " + result + ", reaction = " + reaction + ")"); final MyItem item = mProvider.get(position); if (reaction == RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_REMOVE_ITEM) { mProvider.remove(position); notifyItemRemoved(position); } else if (reaction == RecyclerViewSwipeManager.AFTER_SWIPE_REACTION_MOVE_TO_SWIPED_DIRECTION) { item.setPinedToSwipeLeft(true); notifyItemChanged(position); } else { item.setPinedToSwipeLeft(false); } } }