3
我想從一個gridview中將項目從gingerbread拖到另一個gridview。我打電話onTouchListener,onDragListener,但這些都不是在api 8中可用。我需要,它應該工作在api 8.任何人都可以幫助如何在同一個佈局中將項目從一個gridview拖放到另一個gridview?
我想從一個gridview中將項目從gingerbread拖到另一個gridview。我打電話onTouchListener,onDragListener,但這些都不是在api 8中可用。我需要,它應該工作在api 8.任何人都可以幫助如何在同一個佈局中將項目從一個gridview拖放到另一個gridview?
我有一個非常簡單的解決方案.. 只需添加以下2個函數。
ChoiceTouchListner()
/**
* ChoiceTouchListener will handle touch events on draggable views
*
*/
@SuppressLint({ "NewApi", "NewApi" })
private final class ChoiceTouchListener implements OnTouchListener {
@SuppressLint("NewApi")
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
/*
* Drag details: we only need default behavior - clip data could
* be set to pass data as part of drag - shadow can be tailored
*/
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
view);
// start dragging the item touched
view.startDrag(data, shadowBuilder, view, 0);
return true;
} else {
return false;
}
}
}
ChoiceDragListener()
/**
* DragListener will handle dragged views being dropped on the drop area -
* only the drop action will have processing added to it as we are not -
* amending the default behavior for other parts of the drag process
*
*/
private class ChoiceDragListener implements OnDragListener {
private LinearLayout initiallinear;
public ChoiceDragListener(LinearLayout initialLinear) {
this.initiallinear = initialLinear;
}
@SuppressLint({ "NewApi", "NewApi", "NewApi" })
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// no action necessary
break;
case DragEvent.ACTION_DRAG_ENTERED:
// no action necessary
break;
case DragEvent.ACTION_DRAG_EXITED:
// no action necessary
break;
case DragEvent.ACTION_DROP:
// handle the dragged view being dropped over a drop view
View view = (View) event.getLocalState();
// stop displaying the view where it was before it was dragged
view.setVisibility(View.INVISIBLE);
// view dragged item is being dropped on
LinearLayout dropTarget = (LinearLayout) v;
// view being dragged and dropped
Button dropped = (Button) view;
// update the text in the target view to reflect the data being
// dropped
int recentTag = (Integer) dropped.getTag();
if (dropped.getParent() == dropTarget) {
dropTarget.removeView(dropped);
dropTarget.invalidate();
} else {
initiallinear.removeView(dropped);
initiallinear.invalidate();
}
try {
dropTarget.addView(dropped);
dropTarget.invalidate();
} catch (Exception e) {
System.out.println(e);
}
dropped.setVisibility(View.VISIBLE);
dropTarget.invalidate();
// if an item has already been dropped here, there will be a tag
Object tag = dropTarget.getTag();
/*
* //if there is already an item here, set it back visible in
* its original place if(tag!=null) { //the tag is the view id
* already dropped here int existingID = (Integer)tag; //set the
* original view visible again
* findViewById(existingID).setVisibility(View.VISIBLE); } //set
* the tag in the target view being dropped on - to the ID of
* the view being dropped dropTarget.setTag(dropped.getId());
*/
break;
case DragEvent.ACTION_DRAG_ENDED:
// no action necessary
break;
default:
break;
}
return true;
}
}
你的整個代碼將在DragEvent.ACTION_DROP完成。 此處dropTarget是放置按鈕/視圖的Linearlayout。 initialLayer是您選擇按鈕/視圖的LinearLayout。
您可以將LinearLayout更改爲網格佈局。
不要忘記設置
initialLinear.setOnDragListener(new ChoiceDragListener(linear,initialLinearSecond));
dropTarget.setOnDragListener(new ChoiceDragListener(initialLinear,initialLinearSecond));
ClipData在API 11中添加我需要它應該在API 8 – user2031501 2013-04-09 11:57:35
這項工作是不工作的API 8.發佈整個代碼爲拖動和從一個GridView控件掉落物品其他gridview – user2031501 2013-04-28 18:40:12
看起來從一些流行的在線教程複製和粘貼,但是這個代碼有一些問題。 – 2014-01-31 10:40:12