2013-07-03 6 views
6

Ich versuche, ein Drag & Drop-Beispiel von Android zu implementieren. Nachdem ich lange auf einen Gegenstand gedrückt habe, ziehe ich ihn auf eine Zielebene und lasse ihn dort fallen. Ich bin irgendwie erfolgreich. Aber ich möchte etwas anderes. Ich habe so etwas getan .. Wie man ein Element aus einer Listenansicht zieht und auf ein externes textView legt?

Aber ich möchte alle Elemente zu einer ListView hinzufügen und ich werde ein Element nach langem Drücken auf Listview pic, dann werde ich das Element auf meine Zielebene ziehen und ablegen es dort. Ich möchte so etwas wie diese .. enter image description here

My-Code ist unten angegeben ...

public class MainActivity extends Activity { 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 






    findViewById(R.id.mango).setOnLongClickListener(longListen); 
    findViewById(R.id.orange).setOnLongClickListener(longListen); 
    findViewById(R.id.apple).setOnLongClickListener(longListen); 
    findViewById(R.id.banana).setOnLongClickListener(longListen); 

    findViewById(R.id.drop_here).setOnDragListener(DropListener); 

    listview.setOnItemLongClickListener(new OnItemLongClickListener() { 

     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int pos, long id) { 
      // TODO Auto-generated method stub 

      Log.i("long clicked","pos"+" "+pos); 

      return true; 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

OnLongClickListener longListen = new OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 

     DragShadow dragShadow = new DragShadow(v); 

     ClipData data = ClipData.newPlainText("", ""); 

     v.startDrag(data, dragShadow, v, 0); 

     return false; 
    } 
}; 

private class DragShadow extends View.DragShadowBuilder { 

    ColorDrawable greyBox; 

    public DragShadow(View view) { 
     super(view); 
     // TODO Auto-generated constructor stub 
     greyBox = new ColorDrawable(Color.LTGRAY); 
    } 

    @Override 
    public void onDrawShadow(Canvas canvas) { 
     // TODO Auto-generated method stub 
     // super.onDrawShadow(canvas); 

     greyBox.draw(canvas); 
    } 

    @Override 
    public void onProvideShadowMetrics(Point shadowSize, 
      Point shadowTouchPoint) { 
     // TODO Auto-generated method stub 
     // super.onProvideShadowMetrics(shadowSize, shadowTouchPoint); 
     View v = getView(); 

     int height = (int) v.getHeight()/2; 
     int width = (int) v.getWidth()/2; 

     greyBox.setBounds(0, 0, width, height); 
     shadowSize.set(width, height); 

     shadowTouchPoint.set(width/2, height/2); 

    } 


} 

OnDragListener DropListener = new View.OnDragListener() { 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     // TODO Auto-generated method stub 

     int dragEvent = event.getAction(); 

     switch (dragEvent) { 
     case DragEvent.ACTION_DRAG_ENTERED: 
      Log.i("Drag ", "Entered"); 
      break; 
     case DragEvent.ACTION_DRAG_EXITED: 
      Log.i("Drag ", "Exit"); 
      break; 
     case DragEvent.ACTION_DROP: 
      Log.i("Drag ", "Drop"); 

      TextView target = (TextView) v; 
      TextView dragg = (TextView) event.getLocalState(); 
      target.setText(dragg.getText()); 
      break; 
     default: 
      break; 
     } 

     return true; 
    } 
}; 

} 

Ich habe einige Tutorials versucht, aber ich bin nicht in der Lage Lösung zu erhalten, von dort aus. Android List View Drag and Drop sort

+0

Was würde es am Ziel tun? Ich meine, ist es von seinem Platz entfernt? und es wird zu TEXT konvertiert?! – MAST3RMIND

+0

Ziel zeigt an, welchen Gegenstand ich gezogen habe? Im Grunde möchte ich diesen Code meinem anderen Projekt hinzufügen. Es wird einige andere Funktionalisten hinzugefügt. Wenn ich diese Lösung bekomme, werden meine anderen Anforderungen erfüllt. – TKumar

Antwort

7

Ich habe die Lösung gefunden. Es ist einfach, muss nur startDrag Methode innerhalb von SetOnItemClickListener aufrufen.

listview.setOnItemLongClickListener(new OnItemLongClickListener() { 

     public boolean onItemLongClick(AdapterView<?> arg0, View v, 
       int pos, long id) { 
      // TODO Auto-generated method stub 


      v.startDrag(data, dragShadow, v, 0); 
      return true; 
     } 
    }); 
+6

Können Sie Ihren gesamten Code für Drag n Drop diesen Listeneintrag posten? –

0

Es ist schön Tutorial hier http://www.vogella.com/articles/AndroidDragAndDrop/article.html von Lars Vogel. Aber es funktioniert nur von Android 4 und höher (nach ICS).

Wenn das tut geben Sie eine Lösung versuchen, ein einfaches onTouchListener Hinzufügen eines Objekts zu ziehen und sehen, ob das Objekt beim Ziehen fällt innerhalb der Grenzen der Ansicht, in den Sie ziehen wollen (ein Textview in Ihrem Fall)

Eine einfache Drag-to-Touch-Listener-Implementierung finden Sie hier: https://stackoverflow.com/a/9398861/2138983

Verwandte Themen