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 滑动删除有删除的按钮,点击了才删除