Skip to content

Instantly share code, notes, and snippets.

@ShawInnes
Created July 2, 2014 13:42
Show Gist options
  • Save ShawInnes/35ad16357899081bf3d2 to your computer and use it in GitHub Desktop.
Save ShawInnes/35ad16357899081bf3d2 to your computer and use it in GitHub Desktop.
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Collections.Generic;
using System.Linq;
namespace DraggableList
{
[Activity (Label = "DraggableList", MainLauncher = true, ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
public class MainActivity : Activity
{
private List<DataItem> data = new List<DataItem> ();
public class DataItem
{
public int SortOrder {get;set;}
public string Name {get;set;}
}
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
int i = 0;
data.Add (new DataItem { SortOrder = i++, Name = "AAA"});
data.Add (new DataItem { SortOrder = i++, Name = "444"});
data.Add (new DataItem { SortOrder = i++, Name = "111"});
data.Add (new DataItem { SortOrder = i++, Name = "222"});
data.Add (new DataItem { SortOrder = i++, Name = "999"});
data.Add (new DataItem { SortOrder = i++, Name = "BBB"});
data.Add (new DataItem { SortOrder = i++, Name = "333"});
data.Add (new DataItem { SortOrder = i++, Name = "666"});
data.Add (new DataItem { SortOrder = i++, Name = "777"});
data.Add (new DataItem { SortOrder = i++, Name = "555"});
data.Add (new DataItem { SortOrder = i++, Name = "FFF"});
data.Add (new DataItem { SortOrder = i++, Name = "888"});
data.Add (new DataItem { SortOrder = i++, Name = "CCC"});
data.Add (new DataItem { SortOrder = i++, Name = "DDD"});
data.Add (new DataItem { SortOrder = i++, Name = "EEE"});
ListView listView = FindViewById<ListView> (Resource.Id.listView1);
listView.Adapter = new ArrayAdapter (this, Resource.Layout.ListViewTemplate1, data.OrderBy(p => p.SortOrder).Select(p => p.Name).ToArray());
listView.Touch += (object sender, View.TouchEventArgs e) =>
{
ListView view = ((ListView)sender);
if (e.Event.Action == MotionEventActions.Down)
{
var eventData = ClipData.NewPlainText ("drag", view.PointToPosition((int)e.Event.GetX(), (int)e.Event.GetY()).ToString());
view.StartDrag (eventData, new NullShadowBuilder (view), null, 0);
e.Handled = true;
}
};
listView.Drag += (object sender, View.DragEventArgs e) =>
{
var evt = e.Event;
ListView view = ((ListView)sender);
switch (evt.Action) {
case DragAction.Started:
e.Handled = true;
break;
case DragAction.Entered:
case DragAction.Exited:
break;
case DragAction.Drop:
int oldPos = int.Parse(e.Event.ClipData.GetItemAt (0).Text);
int newPos = view.PointToPosition((int)e.Event.GetX(), (int)e.Event.GetY());
if (oldPos >= 0 && newPos >= 0)
{
var oldItem = data.FirstOrDefault(p => p.Name == view.GetItemAtPosition(oldPos).ToString());
var newItem = data.FirstOrDefault(p => p.Name == view.GetItemAtPosition(newPos).ToString());
Console.WriteLine("Handle ze Drag. Move {0} -> {1}", oldItem.SortOrder, newItem.SortOrder);
int oldSortOrder = oldItem.SortOrder;
oldItem.SortOrder = newItem.SortOrder;
newItem.SortOrder = oldSortOrder;
listView.Adapter = new ArrayAdapter (this, Resource.Layout.ListViewTemplate1, data.OrderBy(p => p.SortOrder).Select(p => p.Name).ToArray());
}
else
Console.WriteLine("Yeah, no. Something messed up");
e.Handled = true;
break;
case DragAction.Ended:
e.Handled = true;
break;
}
};
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment