【问题标题】:How to do drag and drop items from one gridview to another gridview in same layout?如何在同一布局中将项目从一个网格视图拖放到另一个网格视图?
【发布时间】:2013-04-09 10:01:33
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我有一个非常简单的解决方案.. 只需添加以下 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 是放置按钮/视图的线性布局。 initialLayer 是您选择按钮/视图的 LinearLayout。

    您可以将 LinearLayout 更改为网格布局。

    别忘了设置

    initialLinear.setOnDragListener(new ChoiceDragListener(linear,initialLinearSecond));
    dropTarget.setOnDragListener(new ChoiceDragListener(initialLinear,initialLinearSecond));
    

    【讨论】:

    • 这不适用于 api 8。发布将项目从一个 gridview 拖放到另一个 gridview 的整个代码
    • 看起来是从一些流行的在线教程中复制和粘贴的,但是此代码存在一些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2015-12-22
    • 2015-06-25
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多