Frage

I use the drag & drop list view from this tutorial :http://www.youtube.com/watch?v=_BZIvjMgH-Q. With this, we can drag items of the list after a long click, but's it's too long.

The code :

 /**
     * Listens for long clicks on any items in the listview. When a cell has
     * been selected, the hover cell is created and set up.
     */
    private AdapterView.OnItemLongClickListener mOnItemLongClickListener = new AdapterView.OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) {
        //code
        }
    };

I tryed to set "onItemClickListener", but after I need to click once to focus the item and click twice to drag it.

How can I replace this code to have a long click effect shorter ? Thanks for your help

War es hilfreich?

Lösung 2

I have found a solution. I used a custom adapter for my list to listen each item, and I have been created a listener onLongCustomItemClick using the pattern observer.

code of the getView of the adapter :

@Override
    public View getView(int pPosition, View pConvertView, ViewGroup pParent) {
        ViewHolder holder = null;
        final int posCopy = pPosition;
        if (pConvertView == null) {
            LayoutInflater inflater = listViewDraggingAnimation.getLayoutInflater();
            pConvertView = inflater.inflate(R.layout.text_view, null);
            holder = new ViewHolder();
            holder.tvTitle = (TextView) pConvertView.findViewById(R.id.title);
            pConvertView.setOnTouchListener(new OnTouchListener() {

                boolean mHasPerformedLongPress;
                Runnable mPendingCheckForLongPress;

                @Override
                public boolean onTouch(final View v, MotionEvent event) {
                    switch (event.getAction()) {
                    case MotionEvent.ACTION_UP:
                        if (!mHasPerformedLongPress) {
                            // This is a tap, so remove the longpress check
                            if (mPendingCheckForLongPress != null) {
                                v.removeCallbacks(mPendingCheckForLongPress);
                            }
                            // v.performClick();
                        }
                        break;
                    case MotionEvent.ACTION_DOWN:
                        if (mPendingCheckForLongPress == null) {
                            mPendingCheckForLongPress = new Runnable() {
                                public void run() {
                                    updateOnItemCustomLongClickListener();
                                }
                            };
                        }
                        mHasPerformedLongPress = false;
                        v.postDelayed(mPendingCheckForLongPress, timeForLongClick);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        final int x = (int) event.getX();
                        final int y = (int) event.getY();

                        // Be lenient about moving outside of buttons
                        int slop = ViewConfiguration.get(v.getContext()).getScaledTouchSlop();
                        if ((x < 0 - slop) || (x >= v.getWidth() + slop) || (y < 0 - slop)
                                || (y >= v.getHeight() + slop)) {

                            if (mPendingCheckForLongPress != null) {
                                v.removeCallbacks(mPendingCheckForLongPress);
                            }
                        }
                        break;
                    default:
                        return false;
                    }

                    return false;
                }
            });
            pConvertView.setTag(holder);
            pConvertView.setTag(R.id.title, holder.tvTitle);
        } else {
            holder = (ViewHolder) pConvertView.getTag();
        }
        holder.tvTitle.setText(optionList.get(pPosition).getTitle());
        return pConvertView;

Here updateOnItemCustomLongClickListener(); correspond to the update of the observer which execute an override method onCustomLongClick (generated by the interface of my pattern observer) which replace AdapterView.OnItemLongClickListener at the top of the topic. timeForLongClick is the long click time.

Andere Tipps

Ok, so I made three major changes to DynamicListView.java

1) I changed the setter to setOnItemClickListener below

 public void init(Context context) {
    setOnItemClickListener(mOnItemClickListener);
       //setOnScrollListener(mScrollListener);
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    mSmoothScrollAmountAtEdge = (int) (SMOOTH_SCROLL_AMOUNT_AT_EDGE / metrics.density);
        }

2) I used that onItemClickListener instead of the onItemLongClickListener using a catch block exception

        public  AdapterView.OnItemClickListener mOnItemClickListener = new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
            long id){

           try {
            mTotalOffset = 0;
            //Toast.makeText(getContext(), "OnItemClickListener", 100).show();


            int position = pointToPosition(mDownX, mDownY);
            int itemNum = position - getFirstVisiblePosition();

            View selectedView = getChildAt(itemNum);

            mMobileItemId = getAdapter().getItemId(position);
            mHoverCell = getAndAddHoverView(selectedView);
            selectedView.setVisibility(INVISIBLE);

            mCellIsMobile = true;

            updateNeighborViewsForID(mMobileItemId);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();



        }

    }
};

3) I changed the code below so that when you pressed down it will at that same instant invoke the key up event and consequently the onItemClickListener

The only thing that bugs me about it as that if you touch it to quickly the hoverview stays there, but it goes away when you press it again.

@Override

  public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction() & MotionEvent.ACTION_MASK) {

    case MotionEvent.ACTION_DOWN:
        //Toast.makeText(getContext(),"previously touched = true",Toast.LENGTH_SHORT).show();
        if (passThroughActionUp){touchEventsEnded();passThroughActionUp = false; }
        passThroughActionDown = true;

        mDownX = (int) event.getX();
        mDownY = (int) event.getY();
        mActivePointerId = event.getPointerId(0);
        event.setAction(MotionEvent.ACTION_UP);
        break;
    case MotionEvent.ACTION_MOVE:
        if (mActivePointerId == INVALID_POINTER_ID) {
            break;
        }
         //Toast.makeText(getContext(),"  passthroughActionMove = true",Toast.LENGTH_SHORT).show();
        int pointerIndex = event.findPointerIndex(mActivePointerId);

        mLastEventY = (int) event.getY(pointerIndex);
        int deltaY = mLastEventY - mDownY;

            //mCellIsMobile being true means that you are in a dragging event.
        if (mCellIsMobile) {
            mHoverCellCurrentBounds.offsetTo(mHoverCellOriginalBounds.left,
                    mHoverCellOriginalBounds.top + deltaY + mTotalOffset);
            mHoverCell.setBounds(mHoverCellCurrentBounds);
            invalidate();

              handleCellSwitch();

            mIsMobileScrolling = false;
              handleMobileCellScroll();

            return false;
        }
        break;
    case MotionEvent.ACTION_UP:
        //if (passThroughActionDown){touchEventsEnded();passThroughActionDown = false; break;}
        passThroughActionUp = true;
        touchEventsEnded();
        break;
    case MotionEvent.ACTION_CANCEL:
        touchEventsCancelled();
        break;
    case MotionEvent.ACTION_POINTER_UP:
        /*
         * If a multitouch event took place and the original touch dictating
         * the movement of the hover cell has ended, then the dragging event
         * ends and the hover cell is animated to its corresponding position
         * in the listview.
         */
        pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
        final int pointerId = event.getPointerId(pointerIndex);
        if (pointerId == mActivePointerId) {
            touchEventsEnded();
        }
        break;
    default:
        break;
    }

    return super.onTouchEvent(event);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top