Android列表视图中的拖放,点击和滚动

时间:2015-06-13 05:55:54

标签: android android-layout android-fragments android-listview ontouchlistener

所以我有这样的布局: Example of layout

我现在正在使用Listview,每行都有一个Imageview和2个Textview。

我希望能够在此页面上做三件事:

  1. 点击一行(或者只是点击该行中的Imageview也适合​​我)将我带到另一个片段。
  2. 您可以在每个Listview行中拖动图像。它使用 DragShadowBuilder ,因此可以检测是否将其放入底部较暗的灰色区域。
  3. 您可以在列表视图中向上和向下滚动以转到其他现在溢出的项目。
  4. 可以想象,这三种情况难以捕捉,因为很难区分这三种情况(功能重叠的bc)。

    我希望使用onItemLongClickListener来执行拖放操作bc用户通常不会想到长时间按住他们的手指来开始拖放。

    有关如何实现此操作以捕获所有三个用例的任何建议吗?实际上,它可以被认为是2个用例,因为如果我将图像放回原始容器中,它可能会计数点击给我。最复杂的部分是让它以某种方式在Listview中上下滚动...

    提前感谢您的帮助!

    P.S。整个视图在片段中呈现,单击视图或成功将一个视图放入灰色区域,打开一个单独的片段。

3 个答案:

答案 0 :(得分:0)

 /**
 * Call this from a drag source view.
 */
@SuppressLint("NewApi")
public boolean onTouchEvent(MotionEvent ev) {
    if (!mDragging) {
        return false;
    }

    final int action = ev.getAction();
    final int screenX = clamp((int)ev.getRawX(), 0, mDisplayMetrics.widthPixels);
    final int screenY = clamp((int)ev.getRawY(), 0, mDisplayMetrics.heightPixels);

    switch (action) {
    case MotionEvent.ACTION_DOWN:
        // Remember where the motion event started
        mMotionDownX = screenX;
        mMotionDownY = screenY;
        break;
    case MotionEvent.ACTION_MOVE:
        //Set background color of remove comment box layout
        if(((int)ev.getY() <= 50))
            ImageEditingActivityNew.rl_remove.setBackgroundColor(Color.RED);
        else
            ImageEditingActivityNew.rl_remove.setBackgroundColor(Color.TRANSPARENT);

        // Update the drag view.  Don't use the clamped pos here so the dragging looks
        // like it goes off screen a little, intead of bumping up against the edge.
        mDragView.move((int)ev.getRawX(), (int)ev.getRawY());

        // Drop on someone?
        final int[] coordinates = mCoordinatesTemp;
        DropTarget dropTarget = findDropTarget(screenX, screenY, coordinates);
        if (dropTarget != null) {
            if (mLastDropTarget == dropTarget) {
                dropTarget.onDragOver(mDragSource, coordinates[0], coordinates[1],(int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
            } else {
                if (mLastDropTarget != null) {
                    mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],(int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
                }
                dropTarget.onDragEnter(mDragSource, coordinates[0], coordinates[1],
                    (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
            }
        } else {
            if (mLastDropTarget != null) {
                mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
                    (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
            }
        }
        mLastDropTarget = dropTarget;


        /* The original Launcher activity supports a delete region and scrolling.
           It is not needed in this example.

        // Scroll, maybe, but not if we're in the delete region.
        boolean inDeleteRegion = false;
        if (mDeleteRegion != null) {
            inDeleteRegion = mDeleteRegion.contains(screenX, screenY);
        }
        //Log.d(TAG, "inDeleteRegion=" + inDeleteRegion + " screenX=" + screenX
        //        + " mScrollZone=" + mScrollZone);
        if (!inDeleteRegion && screenX < mScrollZone) {
            if (mScrollState == SCROLL_OUTSIDE_ZONE) {
                mScrollState = SCROLL_WAITING_IN_ZONE;
                mScrollRunnable.setDirection(SCROLL_LEFT);
                mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
            }
        } else if (!inDeleteRegion && screenX > scrollView.getWidth() - mScrollZone) {
            if (mScrollState == SCROLL_OUTSIDE_ZONE) {
                mScrollState = SCROLL_WAITING_IN_ZONE;
                mScrollRunnable.setDirection(SCROLL_RIGHT);
                mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
            }
        } else {
            if (mScrollState == SCROLL_WAITING_IN_ZONE) {
                mScrollState = SCROLL_OUTSIDE_ZONE;
                mScrollRunnable.setDirection(SCROLL_RIGHT);
                mHandler.removeCallbacks(mScrollRunnable);
            }
        }
        */
        break;
    case MotionEvent.ACTION_UP:
        //When touch up then remove comment box

        if(((int)ev.getY() <= 50)) {
            ImageEditingActivity.rl_imageEdit_comment.removeAllViews();
            ImageEditingActivity.rl_imageEdit_comment.invalidate();
            //ImageEditingActivity.mDragLayer.removeView(ImageEditingActivity.rl_imageEdit_comment);
            ImageEditingActivity.addComment = true;
            ImageEditingActivity.changeIconBackground("Remove");
            ImageEditingActivity.editParam.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        }

        if (mDragging) {
            drop(screenX, screenY);
        }

        endDrag();
        break;
    case MotionEvent.ACTION_CANCEL:
        cancelDrag();
    }

    return true;
}

答案 1 :(得分:0)

您可以使用fling / swipe手势,而不是长按。您可以覆盖SimpleonGestureListner的onFling方法,并根据阈值检测fling。

答案 2 :(得分:0)

您的要求存在冲突。在你的情况下我会做下一件事:

  1. 你的行只能用长按拖动(然后我会用阴影拖动) 我也会这样做,只有长按时才会出现掉落视图。

  2. override onclick的{​​{1}}方法,您可以点击它,然后调用您的片段展开

  3. 现在,因为您没有覆盖该行上的任何ImageViewonTouchListeners,只要您不点击图片,就可以自由滚动。