如何将项目从一个gridview拖放到同一布局中的另一个gridview?

时间:2013-04-09 10:01:33

标签: android drag-and-drop android-gridview

我想从姜饼中将项目从一个gridview拖到另一个gridview。我正在调用onTouchListener,onDragListener,但这些在api 8中不可用。我需要,它应该在api 8中工作。任何人都可以帮助

1 个答案:

答案 0 :(得分: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));