I have a GridView in an application I am working on. I would like to be able to reorder the items in the GridView via drag-and-drop. I have found lots of help for ListViews but nothing on GridViews. I want to achieve behaviour like in this launcher app http://www.youtube.com/watch?v=u5LISE8BU_E&t=5m30s. Any ideas?
If you don't resolve this problem I will provide my code. But it works on Android 3.0 and above, because I use android drag-n-drop framework
grid = (GridView) findViewById(R.id.grid); grid.setAdapter(new DragGridAdapter(items, getActivity())); .... grid.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { GridView parent = (GridView) v; int x = (int) event.getX(); int y = (int) event.getY(); int position = parent.pointToPosition(x, y); if (position > AdapterView.INVALID_POSITION) { int count = parent.getChildCount(); for (int i = 0; i < count; i++) { View curr = parent.getChildAt(i); curr.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { boolean result = true; int action = event.getAction(); switch (action) { case DragEvent.ACTION_DRAG_STARTED: break; case DragEvent.ACTION_DRAG_LOCATION: break; case DragEvent.ACTION_DRAG_ENTERED: v.setBackgroundResource(R.drawable.shape_image_view_small_gallery_selected); break; case DragEvent.ACTION_DRAG_EXITED: v.setBackgroundResource(R.drawable.shape_image_view_small_gallery_unselected); break; case DragEvent.ACTION_DROP: if (event.getLocalState() == v) { result = false; } else { View droped = (View) event.getLocalState(); GridItem dropItem = ((DragGridItemHolder) droped.getTag()).item; GridView parent = (GridView) droped.getParent(); DragGridAdapter adapter = (DragGridAdapter) parent.getAdapter(); List<GridItem> items = adapter.getItems(); View target = v; GridItem targetItem = ((DragGridItemHolder) target.getTag()).item; int index = items.indexOf(targetItem); items.remove(dropItem); items.add(index, dropItem); adapter.notifyDataSetChanged(); } break; case DragEvent.ACTION_DRAG_ENDED: v.setBackgroundResource(R.drawable.shape_image_view_small_gallery_unselected); break; default: result = false; break; } return result; } }); } int relativePosition = position - parent.getFirstVisiblePosition(); View target = (View) parent.getChildAt(relativePosition); DragGridItemHolder holder = (DragGridItemHolder) target.getTag(); GridItem currentItem = holder.item; String text = currentItem.getFile().getAbsolutePath(); ClipData data = ClipData.newPlainText("DragData", text); target.startDrag(data, new View.DragShadowBuilder(target), target, 0); } } return false;
and DragGridAdapter
public class DragGridAdapter extends BaseAdapter{ private Context context; private List<GridItem> items; public DragGridAdapter(List<GridItem> items, Context context){ this.context = context; this.items = items; } @Override public int getCount() { return items.size(); } @Override public Object getItem(int position) { return items.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { DragGridItemHolder holder; if (convertView == null) { holder = new DragGridItemHolder(); ImageView img = new ImageView(context); holder.image = img; convertView = img; convertView.setTag(holder); } else { holder = (DragGridItemHolder) convertView.getTag(); } holder.item = items.get(position); holder.image.setImageBitmap(items.get(position).getBitmap()); return convertView; } public List<GridItem> getItems() { return items; }
I hope it helps to you
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With