RecyclerView的使用(二)——拖曳移动和滑动删除
程序员文章站
2022-05-12 09:19:14
...
RecyclerView的使用(二)——拖曳移动和滑动删除
1 先获取屏幕的宽度
//声明
private int screenwidth;
//oncreate中
//获取屏幕宽度
WindowManager wm = (WindowManager) MainActivity.this
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
screenwidth =outMetrics.widthPixels;
itemMoveAndDelete();
2 使用
//设置item可移动可滑动删除
private void itemMoveAndDelete(){
// 创建类对象 callback为监听
itemTouchHelper=new ItemTouchHelper(new ItemTouchHelper.Callback(){
// 重写下面的方法
//用于设置拖拽和滑动的方向
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 拖动方向为上或者下
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
// 滑动方向为左或者右 //swipeFlags设置为0的话item不滑动
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags,swipeFlags);
}
//长摁item拖拽时会回调这个方法
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int from=viewHolder.getAdapterPosition();
int to=target.getAdapterPosition();
// 要实现数据的移除
mAdapter.notifyItemMoved(from,to);//更新适配器中item的位置
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//这里处理滑动删除
mAdapter.removeItem(viewHolder.getAdapterPosition());
// 将该行的数据从数据库删除出去
// 首先获取该position的位置
int a =viewHolder.getAdapterPosition();
// 然后根据该位置 去获得该位置的name的textView
View view = mLayoutManager.findViewByPosition(a);
LinearLayout layout = (LinearLayout)view;
TextView status = layout.findViewById(R.id.text_1);
String str = status.getText().toString();
// 再调用数据库删除方法去删除这个name的行
delete(str);
// 也可以对List的数据删除
mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
//返回true则为所有item都设置可以拖拽 要想约束某些item不能拖曳 则设置为false 并在长按点击事件中设置
// itemTouchHelper.startDrag(recyclerview.getChildViewHolder(view));
@Override
public boolean isLongPressDragEnabled() {
return true;
}
// 以下为拖曳动画效果
//当item拖拽开始时调用 并且得到的这个颜色item不会变回去 得在item拖曳结束的方法中改回去
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){
//可以用int形式的color 也可以用string类型的 但是要转换为int类型
viewHolder.itemView.setBackgroundColor(Color.parseColor("#FF6347"));//拖拽时设置背景色为灰色
}
}
//当item拖拽完成时调用
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(Color.parseColor("#00000000"));//拖拽停止时设置背景色为透明
}
//当item视图变化时调用 即被左右滑动时
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
//根据item滑动偏移的值修改item透明度。screenwidth是我提前获得的屏幕宽度
viewHolder.itemView.setAlpha(1-Math.abs(dX)/screenwidth);
}
});
// itemTouchHelper需要与recyclerView绑定才有效果,在recyclerView初始化的时候调用
itemTouchHelper.attachToRecyclerView(mRecyclerView);
}
尚存在的问题:
1 移除的时候,移除的行会放到最后一行,并且值被更新为固定的一个值
不过重启该行会消失
2 拖曳的时候,数据没有进行移动
待完善:
1 滑动删除有删除的按钮,点击了才删除
下一篇: 带参数的scrapy项目爬虫
推荐阅读
-
Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除
-
实现拖拽效果二: 使用RecyclerView + ItemTouchHelper 实现拖拽、删除,滑动删除效果
-
Linux文件的复制、删除和移动命令使用说明
-
Redis学习笔记(二):Java使用Jedis操作Redis(5种类型的增加和删除)
-
RecyclerView之使用ItemTouchHelper实现拖拽和滑动删除
-
RecyclerView的使用(二)——拖曳移动和滑动删除
-
实现拖拽效果二: 使用RecyclerView + ItemTouchHelper 实现拖拽、删除,滑动删除效果
-
Android RecyclerView的Item插入和删除使用