1

このチュートリアルのドラッグ アンド ドロップ リスト ビューを使用します: http://www.youtube.com/watch?v=_BZIvjMgH-Q。これにより、長いクリックの後にリストの項目をドラッグできますが、長すぎます。

コード :

 /**
     * 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
        }
    };

「onItemClickListener」を設定しようとしましたが、1回クリックしてアイテムにフォーカスし、2回クリックしてドラッグする必要があります。

このコードを置き換えて、長いクリック効果を短くするにはどうすればよいですか? ご協力いただきありがとうございます

4

2 に答える 2

1

では、DynamicListView.java に 3 つの大きな変更を加えました。

1)セッターを以下のsetOnItemClickListenerに変更しました

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

2)キャッチブロック例外を使用して、onItemLongClickListenerの代わりにそのonItemClickListenerを使用しました

        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) 下のコードを変更して、キーを押したときに同時にキー アップ イベントを呼び出し、その結果 onItemClickListener を呼び出すようにしました。

それについて私を悩ませている唯一のことは、ホバービューをすばやくタッチするとそこにとどまりますが、もう一度押すと消えてしまうことです。

@オーバーライド

  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);
}
于 2014-11-14T07:50:11.617 に答える
-1

私は解決策を見つけました。リストのカスタム アダプターを使用して各項目をリッスンし、パターン オブザーバーを使用して onLongCustomItemClick リスナーを作成しました。

アダプタの getView のコード:

@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;

ここで updateOnItemCustomLongClickListener(); トピックの上部にある AdapterView.OnItemLongClickListener を置き換えるオーバーライド メソッド onCustomLongClick (パターン オブザーバーのインターフェイスによって生成される) を実行するオブザーバーの更新に対応します。timeForLongClick は長いクリック時間です。

于 2013-11-14T16:12:57.800 に答える