RecycleView使用ItemTouchHelper实现侧滑
2019-03-19 本文已影响0人
Dane_404
浏览博客发现有个ItemTouchHelper可以轻松实现侧滑删除和条目拖拽效果,代码非常简单,亲测有效:
//为RecycleView绑定触摸事件
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//侧滑删除
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
//拖拽
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
//makeMovementFlags 参数一:拖拽事件 参数二:滑动事件
return makeMovementFlags(dragFlags, swipeFlags);
}
//滑动事件
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//交换list两个位置的内容
Collections.swap(mList, viewHolder.getAdapterPosition(), target.getAdapterPosition());
mMyAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
//侧滑事件
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mList.remove(viewHolder.getAdapterPosition());
mMyAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
@Override
public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
Log.d("----",dX+"---"+dY);
if (dX != 0 && dY != 0 || isCurrentlyActive) {
//长按拖拽时底部绘制一个虚线矩形
c.drawRect(viewHolder.itemView.getLeft(),viewHolder.itemView.getTop(),viewHolder.itemView.getRight(),viewHolder.itemView.getBottom(),mPaint);
}
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if(actionState==ACTION_STATE_DRAG){
//长按时调用
ChannelAdapter.ChannelHolder holder= (ChannelAdapter.ChannelHolder) viewHolder;
holder.name.setBackgroundColor(Color.parseColor("#FDFDFE"));
holder.delete.setVisibility(View.GONE);
holder.name.setElevation(5f);
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
ChannelAdapter.ChannelHolder holder= (ChannelAdapter.ChannelHolder) viewHolder;
holder.name.setBackgroundColor(Color.parseColor("#f0f0f0"));
holder.name.setElevation(0f);
holder.delete.setVisibility(View.VISIBLE);
}
@Override
public boolean isLongPressDragEnabled() {
//是否可拖拽
return true;
}
});
//绑定
DefaultItemAnimator animator = new DefaultItemAnimator();
animator.setMoveDuration(300); //设置动画时间
animator.setRemoveDuration(0);
mRecyclerView.setItemAnimator(animator);
helper.attachToRecyclerView(mRecyclerView);