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
Vous devez vous connecter pour publier un commentaire.
L'adaptateur de prendre le tableau et de le corriger. Le tableau sont immuables en java, il y a donc une UnsuportedOperationException lors de l'insertion.
Quand j'ai utilisé une liste, l'exception a été résolu, mais il y avait beaucoup de bugs, avec les événements de glisser-déplacer. J'ai vu que google a fait un tutoriel sur la liste de glisser-déposer, en août 2013. Ils n'utilisent pas leurs propres framwork... je pense que c'est pas adapté à la liste. Je poste le lien si quelqu'un est intéressé :
Faites glisser et déposez tutoriel
OriginalL'auteur Skartt
Vous pouvez toujours créer une vue personnalisée. et faites-le glisser et déposez-les comme vous le souhaitez. Dans votre question, il semble que vous ne souhaitez pas utiliser des bibliothèques externes. Donc, essayez de créer que
things
vous avez appelé comme "niveau 2", "niveau 3" dans la vue personnalisée, puis le faire se produire. aussi essayer de poster votre code un peu sur lequel vous avez déjà travaillé il peut nous aider à juger de votre situation réelle de problème.OriginalL'auteur Prashant Patel