Android GridView reorder elements via Drag and Drop

后端 未结 8 1270
温柔的废话
温柔的废话 2020-12-12 17:43

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

相关标签:
8条回答
  • 2020-12-12 17:53

    My version for drag and drop grid view https://github.com/askerov/DynamicGrid.
    It's extends original GridView, supports drag and drop to reorder items, auto-scroll if drag out of screen. It's completely functional on 3.0+ api, but supports 2.2 and 2.3 with limitations (no animations).

    0 讨论(0)
  • 2020-12-12 17:56

    Have a look at thquinn's DraggableGridView, This was developed targeting Android 2.2 (API level 8). Hope this helps someone :)

    0 讨论(0)
  • 2020-12-12 18:05

    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

    0 讨论(0)
  • 2020-12-12 18:06

    I recently found a solution on which its author spent quite some time here http://blahti.wordpress.com/2012/03/03/improved-drag-drop-for-gridview/ There are 4 previous related blog posts explaining what is going on in more detail there.

    0 讨论(0)
  • 2020-12-12 18:07

    Here's a library from h6ah4i that takes advantage of the Recycler Views to offer a drag and drop gridview with reorder capabilities.

    0 讨论(0)
  • 2020-12-12 18:09

    Probably PagedDragDropGrid project is what you need: https://github.com/mrKlar/PagedDragDropGrid

    It provides custom ViewGroup (similar to GridView) with feature of smooth reordering (exactly like in your video). Probably it'll require a bit of customizations, but it's worth.

    Hope it'll help.

    0 讨论(0)
提交回复
热议问题