RecylerView全简析之仿支付宝侧滑删除和拖动排序
程序员文章站
2022-06-01 15:05:34
...
ItemTouchHelper
//条目的一些拖动触摸的工具类
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//获取触摸的方向,包含两个参数 1.拖动dragFlags 2.侧滑删除swipeFlags
//代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT
int swipeFlages = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
//不做处理默认为0
int dragFlags=0;
if(recyclerView.getLayoutManager() instanceof GridLayoutManager){
dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}else{
dragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT ;
}
return makeMovementFlags(dragFlags, swipeFlages);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
//状态发生变化 拖动改变 侧滑状态 正常状态
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
//设置高亮
viewHolder.itemView.setBackgroundColor(Color.YELLOW);
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//一定要刷新数据 当你拖动完毕后mData数据已经改变
mAdapter.notifyDataSetChanged();
//动画执行完毕,恢复
viewHolder.itemView.setBackgroundColor(Color.parseColor("#ECECEC"));
//显示列表侧滑删除之后有些条目不出来(可以看Google的源码)
// 侧滑和拖动其实都是使用的ViewCompat这一个类
ViewCompat.setTranslationX(viewHolder.itemView,0);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//获取原来的位置
int fromPosition = viewHolder.getAdapterPosition();
//获取目标的位置
int targetPosition = target.getAdapterPosition();
//替换
mAdapter.notifyItemMoved(fromPosition, targetPosition);
Log.e("TAG", fromPosition + "======>" + targetPosition);
//数据没有发生变化(mDatas中数据)
if (fromPosition > targetPosition) {//1>0
for (int i = fromPosition; i > targetPosition; i--) {//向上移动
Collections.swap(mDatas, i, i - 1);//向前移动
//改变实体集中的数据
}
} else {// 2 ->5
for (int i = fromPosition; i < targetPosition; i++) {//向下拖拽
Collections.swap(mDatas, i, i + 1);//向后移
}
}
//mAdapter.notifyDataSetChanged();
//测试数据实体集是否改变
for (String mData : mDatas) {
Log.e("TAG", mData);
}
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// 侧滑删除执行完毕,需要移除,或者更新Adapter
int currentSwipePosition = viewHolder.getAdapterPosition();//当前要移除的位置
//这样没有动画
//mDatas.remove(currentSwipePosition);
//mAdapter.notifyDataSetChanged();
mAdapter.notifyItemRemoved(currentSwipePosition);
// 数据对应的也移除
mDatas.remove(currentSwipePosition);
}
});
itemTouchHelper.attachToRecyclerView(mRecyclerView);
上一篇: 在云环境上使用SLF4J对Java程序进行日志记录
下一篇: JS求解三元一次方程组值的方法