Android 初步实现item可拖拽RecyclerView (Grid模式下)
0.首先先给一张效果图。部分功能么有实现,好吧我承认我不太会。仅仅给自己留个记录。供参考。
1.先说下思路 用到的类:DragParent (继承RelativeLayout) 、DragGridView (继承RecyclerView)、Bean item数据项、DragAdapter (DragGridView适配器)
外加2个接口PreDragListener(即将进入拖拽状态)、DraggingListener(拖拽中,拖拽结束)。
2.当长按 DragGridView 的item时,该Item View设置不可见状态,通过接口方法告知 DragParent 即将进入拖拽状态。
3.DragParent 进入拖拽状态 马上获取被拖拽item View 对应的Bitmap,并把该Bitmap放入ImageView中,添加到DragParent 内部 item view的位置。
4.重写DragParent dispatchTouchEvent() ,在拖拽状态下 Move 计算当前event x、y坐标位于DragGridView 的那个位置。
5.如果被拖拽的item的位置与当前拖拽点x、y坐标所属item位置不一致,说明需要DragGridView remove掉被拖拽item ,并且在当前拖拽点位置insert。
6.首先自定义一个ID。遇到不要忘记,主要是实现 DragGridView 的itemView与 Bean进行绑定用的。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="id_bean_" type="id"/>
</resources>
7.先看看 Bean 和接口类 简写了。
public class Bean {
String str;//item+i
boolean isDragged;//是否处于拖拽状态
int rid;//该Bean对应的 图片资源id
boolean isLongClicked;
public Bean(String str, int rid) {
this.str = str;
this.rid = rid;
}
}
public interface PreDragListener {
/**
* 某个DragGridView 的ItemView 进入拖拽状态回调
*/
void preDrag(View view);
}
public interface DraggingListener {
/**
* 拖拽中时,返回的当前拖拽的坐标
*/
void dragging(float x, float y);
void dragEnd();
}
8.DragParent 实现了PreDragListener,当DragAdapter 内部触发长按回调时 需要调用该接口告知 DragParent那个itemView 进入拖拽状态。
9.DragGridView 实现了DraggingListener,当DragParent 内部添加的imagevie