Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android GridView reorder elements via Drag and Drop

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?

like image 871
Martin C. Avatar asked Aug 22 '11 11:08

Martin C.


1 Answers

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

like image 107
Dmytro Boichenko Avatar answered Sep 17 '22 13:09

Dmytro Boichenko