文章http://blog.youkuaiyun.com/michael1112/article/details/53907868 描述了recycleView的原理。
本文章将动画进行了封装。 用接口回调将onItemMove(int
fromPosition, int toPosition) 的实现放到具体的adapter
1.实现 ItemDragHelperCallback
public class ItemDragHelperCallback extends ItemTouchHelper.Callback { private OnItemMoveListener mOnItemMoveListener; private boolean mIsLongPressEnabled; public void setLongPressEnabled(boolean longPressEnabled) { mIsLongPressEnabled = longPressEnabled; } public interface OnItemMoveListener { boolean onItemMove(int fromPosition, int toPosition); } public ItemDragHelperCallback(OnItemMoveListener onItemMoveListener) { mOnItemMoveListener = onItemMoveListener; } @Override public boolean isLongPressDragEnabled() { return mIsLongPressEnabled; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = setDragFlags(recyclerView); int swipeFlags = 0; return makeMovementFlags(dragFlags, swipeFlags); } private int setDragFlags(RecyclerView recyclerView) { int dragFlags; RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) { dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; } else { dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; } return dragFlags; } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return !isDifferentItemViewType(viewHolder, target) && mOnItemMoveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); } private boolean isDifferentItemViewType(RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return viewHolder.getItemViewType() != target.getItemViewType(); } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } }
2.NewsChannelActivity.java
@Override public void returnMineNewsChannels(List<NewsChannelTable> newsChannelsMine) { channelAdapterMine = new ChannelAdapter(mContext,R.layout.item_news_channel); newsChannelMineRv.setLayoutManager(new GridLayoutManager(this, 4, LinearLayoutManager.VERTICAL, false)); newsChannelMineRv.setItemAnimator(new DefaultItemAnimator()); newsChannelMineRv.setAdapter(channelAdapterMine); channelAdapterMine.replaceAll(newsChannelsMine); channelAdapterMine.setOnItemClickListener(new ChannelAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { NewsChannelTable newsChannel = channelAdapterMine.get(position); channelAdapterMore.add(newsChannel); channelAdapterMine.removeAt(position); mPresenter.onItemAddOrRemove((ArrayList<NewsChannelTable>) channelAdapterMine.getAll(), (ArrayList<NewsChannelTable>)channelAdapterMore.getAll()); } }); ItemDragHelperCallback itemDragHelperCallback = new ItemDragHelperCallback(channelAdapterMine); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragHelperCallback); itemTouchHelper.attachToRecyclerView(newsChannelMineRv); channelAdapterMine.setItemDragHelperCallback(itemDragHelperCallback); }
3..ChannelAdapter.java
public class ChannelAdapter extends CommonRecycleViewAdapter<NewsChannelTable>implements ItemDragHelperCallback.OnItemMoveListener{ private ItemDragHelperCallback mItemDragHelperCallback; private OnItemClickListener mOnItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } public void setItemDragHelperCallback(ItemDragHelperCallback itemDragHelperCallback) { mItemDragHelperCallback = itemDragHelperCallback; } public ChannelAdapter(Context context, int layoutId) { super(context, layoutId); } @Override public void convert(ViewHolderHelper helper, NewsChannelTable newsChannelTable) { helper.setText(R.id.news_channel_tv,newsChannelTable.getNewsChannelName()); if (newsChannelTable.getNewsChannelFixed()) { helper.setTextColor(R.id.news_channel_tv,ContextCompat.getColor(mContext,R.color.gray)); }else{ helper.setTextColor(R.id.news_channel_tv,ContextCompat.getColor(mContext,R.color.gray_deep)); } handleLongPress(helper,newsChannelTable); handleOnClick(helper,newsChannelTable); } private void handleLongPress(ViewHolderHelper helper,final NewsChannelTable newsChannelTable) { if (mItemDragHelperCallback != null) { helper.itemView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mItemDragHelperCallback.setLongPressEnabled(newsChannelTable.getNewsChannelIndex()==0?false:true); return false; } }); } } private void handleOnClick(final ViewHolderHelper helper,final NewsChannelTable newsChannelTable) { if (mOnItemClickListener != null) { helper.itemView.setOnClickListener(new OnNoDoubleClickListener() { @Override protected void onNoDoubleClick(View v) { if (!newsChannelTable.getNewsChannelFixed()) { mOnItemClickListener.onItemClick(v, helper.getLayoutPosition()); } } }); } } @Override public boolean onItemMove(int fromPosition, int toPosition) { if (isChannelFixed(fromPosition, toPosition)) { return false; } Collections.swap(getAll(), fromPosition, toPosition); notifyItemMoved(fromPosition, toPosition); RxBus.getInstance().post(AppConstant.CHANNEL_SWAP,new ChannelItemMoveEvent(fromPosition, toPosition)); return true; } private boolean isChannelFixed(int fromPosition, int toPosition) { return (getAll().get(fromPosition).getNewsChannelFixed() || getAll().get(toPosition).getNewsChannelFixed())&&(fromPosition==0||toPosition==0); } public interface OnItemClickListener { void onItemClick(View view, int position); } }
git hub: https://github.com/whtchl/AndroidNews.git
本文介绍如何在RecycleView中实现动画效果,并通过接口回调将onItemMove方法的实现置于具体的adapter中。详细步骤包括:1) 实现ItemDragHelperCallback;2) 在NewsChannelActivity.java中的应用;3) ChannelAdapter.java的改造。示例代码可在GitHub项目AndroidNews中查看。

被折叠的 条评论
为什么被折叠?



