[英]Scrolling a GridView by ACTION_DRAG_LOCATION and swapping items in the Gridview's ArrayAdapter on ACTION_DROP
我希望用户能够交换项目(一个ImageView
一个RelativeLayout
一个) GridView
,但我也希望他们能够滚动GridView
向上或向下,如果他们拖动图像的顶部或底部GridView
,尊重。
如果在支持ArrayAdapter
情况下实现拖动侦听器,则无法进行滚动。 如果按如下所示在GridView
实现它,则无法获取放置在其中的数组项的位置。
有什么办法吗? 请注意我遇到问题的评论。 谢谢!
我有一个实现OnDragListener
的GridView
,但是我不知道如何获得要交换的位置。
这是长按监听器:
gv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> grv, View v,
int position, long row) {
mVibrator.vibrate(VIBRATE_DURATION);
ClipData cd = ClipData.newPlainText("position", String.valueOf(position));
v.startDrag(cd, new View.DragShadowBuilder(v), v, 0);
return true;
}
});
这是我的拖动监听器:
gv.setOnDragListener(new OnDragListener() {
Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);
Drawable normalShape = getResources().getDrawable(R.drawable.shape);
private static final int THRESHHOLD = 200;
@Override
public boolean onDrag(View v, DragEvent event) {
int height = v.getMeasuredHeight();
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
v.setBackground(enterShape);
break;
case DragEvent.ACTION_DRAG_ENTERED:
v.setBackground(enterShape);
break;
case DragEvent.ACTION_DRAG_EXITED:
v.setBackground(normalShape);
break;
case DragEvent.ACTION_DRAG_LOCATION:
float y = event.getY();
if (height - y < THRESHHOLD) {
gv.smoothScrollBy(200, 300);
Log.i(TAG, "Scrolling DOWN");
} else if (height - y > height - THRESHHOLD) {
gv.smoothScrollBy(-200, 300);
Log.i(TAG, "Scrolling UP");
}
break;
case DragEvent.ACTION_DROP:
//Gridview position to swap with.
// HOW DO I GET THIS?
int i = position;
int j = Integer.parseInt(event.getClipData().getItemAt(0).getText().toString());
Collections.swap(mUriList, i, j);
Log.i(TAG, "Swapped " + i+ " with " + j);
break;
case DragEvent.ACTION_DRAG_ENDED:
v.setBackground(null);
mAdapter.notifyDataSetChanged();
default:
break;
}
return true;
}
});
答案是使GridView最终版本并使用gv.pointToPosition((int)event.getX(), (int)event.getY());
获得职位。
case DragEvent.ACTION_DROP:
//Gridview position to swap with.
int i =gv.pointToPosition((int)event.getX(), (int)event.getY());
int j = Integer.parseInt(event.getClipData().getItemAt(0).getText().toString());
Collections.swap(mUriList, i, j);
Log.i(TAG, "Swapped " + i+ " with " + j);
break;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.