繁体   English   中英

通过ACTION_DRAG_LOCATION滚动GridView并在ACTION_DROP上交换Gridview的ArrayAdapter中的项目

[英]Scrolling a GridView by ACTION_DRAG_LOCATION and swapping items in the Gridview's ArrayAdapter on ACTION_DROP

我希望用户能够交换项目(一个ImageView一个RelativeLayout一个) GridView ,但我也希望他们能够滚动GridView向上或向下,如果他们拖动图像的顶部或底部GridView ,尊重。

如果在支持ArrayAdapter情况下实现拖动侦听器,则无法进行滚动。 如果按如下所示在GridView实现它,则无法获取放置在其中的数组项的位置。

有什么办法吗? 请注意我遇到问题的评论。 谢谢!

我有一个实现OnDragListenerGridView ,但是我不知道如何获得要交换的位置。

这是长按监听器:

gv.setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> grv, View v,
                int position, long row) {
            mVibrator.vibrate(VIBRATE_DURATION);
            ClipData cd = ClipData.newPlainText("position", String.valueOf(position));
            v.startDrag(cd, new View.DragShadowBuilder(v), v, 0);
            return true;
        }
    });

这是我的拖动监听器:

 gv.setOnDragListener(new OnDragListener() {

        Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);
        Drawable normalShape = getResources().getDrawable(R.drawable.shape);

        private static final int THRESHHOLD = 200;

        @Override
        public boolean onDrag(View v, DragEvent event) {

            int height = v.getMeasuredHeight();

            switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                v.setBackground(enterShape);
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                v.setBackground(enterShape);
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                v.setBackground(normalShape);
                break;
            case DragEvent.ACTION_DRAG_LOCATION:

                float y = event.getY();
                if (height - y < THRESHHOLD) {
                    gv.smoothScrollBy(200, 300);
                    Log.i(TAG, "Scrolling DOWN");
                } else if (height - y > height - THRESHHOLD) {
                    gv.smoothScrollBy(-200, 300);
                    Log.i(TAG, "Scrolling UP");
                }
                break;
            case DragEvent.ACTION_DROP:
                //Gridview position to swap with.
                // HOW DO I GET THIS?
                int i = position;
                int j = Integer.parseInt(event.getClipData().getItemAt(0).getText().toString());
                Collections.swap(mUriList, i, j);
                Log.i(TAG, "Swapped " + i+ " with " + j);
                break;
            case DragEvent.ACTION_DRAG_ENDED:
                v.setBackground(null);
                mAdapter.notifyDataSetChanged();
            default:
                break;
            }
            return true;
        }

    });

答案是使GridView最终版本并使用gv.pointToPosition((int)event.getX(), (int)event.getY()); 获得职位。

case DragEvent.ACTION_DROP:
    //Gridview position to swap with.
    int i =gv.pointToPosition((int)event.getX(), (int)event.getY());
    int j = Integer.parseInt(event.getClipData().getItemAt(0).getText().toString());
    Collections.swap(mUriList, i, j);
    Log.i(TAG, "Swapped " + i+ " with " + j);
    break;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM