item 的拖拽移动
2019-04-24 本文已影响0人
一只有梦想的猫头鹰
一、
定义一个接口
public interface TouchBack {
void OnDragItem(int fromposition, int toposition);
void OnDeleteItem(int position);
}
二、
ItemTouchHelper.Callback中的方法,所以我们首先自定义自己的类来继承它,重写其中方法。首先是getMovementFlags()方法,这个方法主要作用是定义移动标识,所以针对拖动效果,我们可以首先定义拖动标识,通过ItemTouchHelper提供的参数来定义
简单来说: 就是 定义 参数 提供拖动标识;
public class SimpTouchback extends ItemTouchHelper.Callback {
private TouchBack back;
//利用接口回调 回调内容
public SimpTouchback(TouchBack back) {
this.back = back;
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int drag = ItemTouchHelper.DOWN | ItemTouchHelper.UP; // 上下
int Delete = ItemTouchHelper.LEFT; //向左
return makeMovementFlags( drag, Delete ); //允许上下 向左
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
back.OnDragItem( viewHolder.getAdapterPosition(), viewHolder1.getAdapterPosition() ); //接口回调 回调 item交换的位置
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) { //在这里可以对itme 做删除
back.OnDeleteItem( viewHolder.getAdapterPosition() );
}
@Override
public boolean isItemViewSwipeEnabled() { // 是否 对拖动效果 进行 屏蔽
return super.isItemViewSwipeEnabled(); //默认是不会屏蔽
}
@Override
public boolean isLongPressDragEnabled() { // 这个跟上一个方法的意思差不多是否 对拖动效果 进行 屏蔽
return super.isLongPressDragEnabled();//默认是不会屏蔽
}
}
三、
在适配中 实现接口 实现重写其中的方法
例如:
@Override
public void OnDragItem(int fromposition, int toposition) {
Collections.swap( list, fromposition, toposition ); //Collections 是一个集合的 工具 swap 交换
notifyItemMoved( fromposition, toposition );// 简单来说就只刷新这两个位置
}
@Override
public void OnDeleteItem(int position) {
list.remove( position ); // 删除集合中的位置
notifyItemRemoved( position ); // 只刷新 删除的位置
}
四 、
做完这一系列的 操作 剩下的只有我们的activity了
Myadapter myadapter = new Myadapter( list ); // 这个不用介绍了吧
mRec.setAdapter( myadapter ); //=_=
mRec.setLayoutManager( new LinearLayoutManager( this ) ); //=_=
mRec.addItemDecoration( new DividerItemDecoration( this, DividerItemDecoration.VERTICAL ) ); //这个是 给item添加 一条分割线
SimpTouchback simpTouchback = new SimpTouchback( myadapter ); //这个就是重头戏了 new 出对象 这个就是接口回调的机制了
ItemTouchHelper itemTouchHelper = new ItemTouchHelper( simpTouchback );// 通过我 小帮手 itemtouchHelper
、、
itemTouchHelper.attachToRecyclerView( mRec ); // 把我们设置的属性 最终给我们的 Recycler。