Faites glisser et déposez liste sans bibliothèque

J'ai une vue affichant des données. Maintenant je veux intégrer la fonctionnalité de glisser-déposer des éléments dans cette liste. Je veux dire, je veux faites glisser l'élément à partir du niveau 1 au niveau 3, et ainsi de suite...

J'ai obtenu des exemples de glisser-déposer listview, mais toutes font référence à une bibliothèque externe. J'ai besoin d'utiliser uniquement le sdk officiel et je sais que le glisser-déposer est disponible depuis android 3.0.

J'ai essayé de construire mon auto, mais il ne fonctionne pas pour moi... la plupart du tutoriel avec cette fonctionnalité (par glisser-déposer à partir d'android 3.0) sont sur le point de glisser et déposer des points de vue et pas d'éléments dans une liste.

Edit : je ne veux pas de la bibliothèque parce que, depuis le Nid d'abeille il y a une fonctionnalité sur android pour faire glisser et déposer des points de vue, et je veux l'utiliser pour les éléments. Niveau position moyenne dans la liste.
Voici mon code :

MainActivity.java :

public class MainActivity extends ListActivity {
private ListView lvSort = null;
private ArrayAdapter<String> sortAdapter = null;
private View layoutDropArea = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] sortCategories = {"time", "service", "equipment", "type", "alert", "system", "priority"};
sortAdapter = new ArrayAdapter<String>(this, R.layout.list_item,R.id.textView1,
sortCategories);
setListAdapter(sortAdapter);
lvSort = getListView();
lvSort.setTextFilterEnabled(true);
layoutDropArea = findViewById(R.id.dropTarget);
setupDragDrop();
}
/**
* Setup what to do when we drag list items
*/
public void setupDragDrop() {
lvSort.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View v,
int position, long arg3) {
TextView txtview = (TextView)v.findViewById(R.id.textView1);
String value = txtview.toString();
ClipData data = ClipData.newPlainText("procedure", value);
v.startDrag(data, new DragShadowBuilder(v), null, 0);//!!
return true;
}
});
DragListener mDragListener = new DragListener();
//mListView.setOnDragListener(mDragListener);
layoutDropArea.setOnDragListener(mDragListener);
}
private boolean processDrop(DragEvent event, int newPosition) {
ClipData data = event.getClipData();
if (data != null) {
if (data.getItemCount() > 0) {
Item item = data.getItemAt(0);
String value = item.toString();
updateViewsAfterDropComplete(value, newPosition);
return true;
}
}
return false;
}
private void updateViewsAfterDropComplete(String listItem, int index) {
Log.d("InsertItem", "Position: " + index);
sortAdapter.insert(listItem, index);
sortAdapter.notifyDataSetChanged();
}
private boolean processDragStarted(DragEvent event) {
ClipDescription clipDesc = event.getClipDescription();
if (clipDesc != null) {
return clipDesc.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN);
}
return false;
}
protected class DragListener implements OnDragListener {
public boolean onDrag(View v, DragEvent event) {
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_ENTERED:
//v.setBackgroundColor(Color.GRAY);
return false;
case DragEvent.ACTION_DRAG_EXITED:
//v.setBackgroundColor(Color.TRANSPARENT);
return true;
case DragEvent.ACTION_DRAG_STARTED:
return true;
case DragEvent.ACTION_DRAG_LOCATION:
//v.setVisibility(View.VISIBLE);
//return false;
return processDragStarted(event);
case DragEvent.ACTION_DROP:
v.setBackgroundColor(Color.TRANSPARENT);
int newPosition = lvSort.pointToPosition(
(int) (event.getX()), (int) event.getY());
Log.d("Position", Integer.toString(newPosition));
if (newPosition != ListView.INVALID_POSITION)
return processDrop(event, newPosition);
else
return false;
default:
return true;
}
}
}
}

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dropTarget"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/list" >
</ListView>
</LinearLayout>

list_item.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>

Normalement je pourrais faire glisser les éléments dans la liste et de les déposer à la poste, mais j'ai un problème, quand je fais un clic long sur un élément, j'ai cette exception : java.lang.UnsupportedOperationException au com.exemple.dragdrop.MainActivity.updateViewsAfterDropComplete(MainActivity.java:77)

Cette ligne correspondent à ce qui suit : "sortAdapter.insert(listItem, index);"

S'il vous plaît aider avec des indices.

Merci & en ce qui Concerne

OriginalL'auteur Skartt | 2013-10-28