【问题标题】:How to drag an item from gridview and drop into another layout如何从gridview拖动一个项目并放入另一个布局
【发布时间】:2014-01-27 11:35:29
【问题描述】:

我有一个网格视图,我设置了一个包含图像视图数组列表的适配器。我想从网格视图中拖动一个项目并将其放入另一个布局中。我面临的问题是如何将触摸侦听器设置为网格视图的单个项目,以便我可以将其放在目标中。如果我在网格视图中设置 ontouchlistener,它会选择整个网格视图而不是单个项目。请帮我............... 我试过这段代码:

        gridview.setOnItemClickListener(new MyOnItemClickListener());
        gridview.setOnDragListener(new MyOnDragListener());
        private final class MyTouchListener implements OnTouchListener {
        public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
         ClipData data = ClipData.newPlainText("", "");
         DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
         view.startDrag(data, shadowBuilder, view, 0);
         return true;
        } else {
        return false;
       }
       }
         final class MyOnDragListener implements OnDragListener{

    Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);
    Drawable historyDrawer;
    @Override
    public boolean onDrag(View v, DragEvent event) {
        LocalLogger.LOGGER.info("Under on drag listener");
        switch(event.getAction()){
        case DragEvent.ACTION_DRAG_STARTED:
            break;
        case DragEvent.ACTION_DRAG_ENTERED:
            historyDrawer=v.getBackground();
            v.setBackground(enterShape);
            break;
        case DragEvent.ACTION_DRAG_EXITED:
            v.setBackground(historyDrawer);
            break;
        case DragEvent.ACTION_DROP:
            break;
        case DragEvent.ACTION_DRAG_ENDED:
            break;
        }
        return false;
    }

}

【问题讨论】:

    标签: android gridview drag-and-drop


    【解决方案1】:

    使用OnItemLongClickListener 查找长点击的子项。

    【讨论】:

      【解决方案2】:

      像这样在网格中添加它 -

      gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
      
              public boolean onItemLongClick(AdapterView<?> arg0, View view, int position, long arg3) {
                  ClipData data = ClipData.newPlainText("", "");
                  View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                  view.startDrag(data, shadowBuilder, view, 0);
                  return true;
              }
          });
      

      【讨论】:

      • startDrag 方法在 api 级别 23 及以上可用。因此,该解决方案目前不适用于大多数设备。
      【解决方案3】:

      由于您只在触摸侦听器上使用ACTION_DOWN,因此您可以使用 onItemClickListener 或 onItemLongClickListener 进行拖动。

      grid.setOnItemLongClickListener(new OnItemLongClickListener() {
      
              @Override
              public boolean onItemLongClick(AdapterView<?> parent, View v,
                      int pos, long id) {
                  ClipData data = ClipData.newPlainText("", "");
                  DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
                          v);
                  // start dragging the item touched
                  v.startDrag(data, shadowBuilder, v, 0);
                  return false;
              }
          });
      

      【讨论】:

      • 感谢您的回复,但我想在填充整个 gridview 列表后更改每个网格项目的 imageview 源。所以没有 onTouchlistener 的意义。
      • 我编辑了我的答案,如果您需要 onDrag 部分,请告诉我。
      【解决方案4】:

      我用下一个方法解决了:

      gridView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View view, MotionEvent motionEvent) {
           float currentXPosition = motionEvent.getX();
           float currentYPosition = motionEvent.getY();
           int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);
           View v = gridView.getChildAt(position);
           ClipData.Item item = new ClipData.Item("" + position); // here you send any data you want, I sent position
           String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_HTML};
           ClipData data = new ClipData("" + position, mimeTypes, item);
           View.DragShadowBuilder shadow = new View.DragShadowBuilder(v);
           view.startDrag(data, shadow, null, 0);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        相关资源
        最近更新 更多