2013-07-03 1 views
6

Sto cercando di implementare un esempio di andatura e rilascio di Android. Dopo aver premuto a lungo su un oggetto, lo sto trascinando a un livello target e lasciandolo cadere. Ho successo in qualche modo. Ma voglio qualcosa di diverso. Ho fatto qualcosa di simile a questo .. enter image description hereCome trascinare un oggetto da un listview e rilasciarlo su un textView esterno?

Ma voglio aggiungere tutti gli elementi a un listView e devo inserire un elemento dopo aver premuto a lungo su listview, quindi dovrò trascinare l'oggetto al mio livello di destinazione e rilasciarlo è lì. Voglio qualcosa di simile .. enter image description here

il mio codice è riportato qui di seguito ...

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; 
    } 
}; 

} 

Ho provato alcuni tutorial, ma sono in grado di ottenere la soluzione da lì. Android List View Drag and Drop sort

+0

Cosa farebbe in target? Voglio dire, è rimosso dal suo posto? e viene convertito in TESTO?! – MAST3RMIND

+0

Il target mostrerà quale elemento ho trascinato? Fondamentalmente voglio aggiungere questo codice al mio altro progetto. Ci saranno aggiunti altri funzionalisti. Se ottengo questa soluzione, i miei altri requisiti saranno soddisfatti. – TKumar

risposta

7

Ho trovato la soluzione. È facile, basta chiamare il metodo startDrag all'interno di setOnItemClickListener.

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

Puoi postare l'intero codice per trascinare e rilasciare quell'elemento dell'elenco? –

0

C'è bel tutorial qui http://www.vogella.com/articles/AndroidDragAndDrop/article.html da Lars Vogel. Ma funzionerà solo da Android 4 e versioni successive (dopo ICS).

Se quello non si danno una soluzione provare ad aggiungere un semplice onTouchListener per trascinare un oggetto e vedere se l'oggetto mentre si trascina cade entro i limiti della vista che si desidera trascinare in (a TextView nel tuo caso)

Una semplice implementazione Drag onuchlistener può essere trovata qui: https://stackoverflow.com/a/9398861/2138983