RecycleView 设置监听 setOnDragListener如何判断 拖动事件是否 在 item内
时间: 2024-02-22 20:57:32 浏览: 72
Android Recycleview 固定item并且可拖拽
如果您想要在RecyclerView中监听拖动事件并判断它是否在item内,可以使用以下步骤:
1. 在您的RecyclerView.Adapter中,为每个item设置一个OnTouchListener,并将其添加到itemView中。
2. 在OnTouchListener中,您可以监听ACTION_DOWN、ACTION_MOVE和ACTION_UP事件,并在ACTION_DOWN事件中使用View.startDrag()方法来启动拖动操作。
3. 在您的RecyclerView中,使用setOnDragListener()方法设置一个DragEventListener,以便在拖动操作发生时收到通知。
4. 在DragEventListener的onDrag()方法中,检查拖动事件是否在item内。您可以使用以下方法来判断:
a. 获取拖动事件的x和y坐标
b. 获取RecyclerView中所有可见的item的位置和大小
c. 对于每个item,检查拖动事件是否在item内,如果是,则返回true,否则返回false。
d. 如果所有的item都不包含拖动事件,则返回false。
以下是一个示例代码,说明如何在RecyclerView中监听拖动事件并判断它是否在item内:
```
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> mData;
public MyAdapter(List<String> data) {
mData = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, parent, false);
itemView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
v.startDrag(null, new View.DragShadowBuilder(v), null, 0);
return true;
}
return false;
}
});
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String item = mData.get(position);
holder.mTextView.setText(item);
}
@Override
public int getItemCount() {
return mData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.text_view);
}
}
}
public class MyActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(new MyAdapter(Arrays.asList("Item 1", "Item 2", "Item 3")));
mRecyclerView.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return isInsideItem(event.getX(), event.getY());
case DragEvent.ACTION_DROP:
// Handle drop event
return true;
default:
return false;
}
}
});
}
private boolean isInsideItem(float x, float y) {
Rect rect = new Rect();
for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
View child = mRecyclerView.getChildAt(i);
child.getGlobalVisibleRect(rect);
if (rect.contains((int) x, (int) y)) {
return true;
}
}
return false;
}
}
```
在此示例中,我们为每个item设置了一个OnTouchListener,并在其中启动了拖动操作。我们还为RecyclerView设置了一个DragEventListener,并在其中检查拖动事件是否在item内。如果是,则返回true,否则返回false。
阅读全文