Search code examples
androidgridviewontouchlistener

Gridview Scroll with OnTouchListener


Basically, I want to fast select item as well as scroll Gridview. In OnItemClickListener scroll working fine but its not fast select multiple item like OnTouchListener.

My code:

gridView.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent me) {

            int action = me.getActionMasked();  
            float currentXPosition = me.getX();
            float currentYPosition = me.getY();
            int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);

            switch (action) {
                case (MotionEvent.ACTION_MOVE):

                break;
                case (MotionEvent.ACTION_UP):
                    if (position != -1) {
                        //Here my logic to add item in basket list 
                        return true;
                    }
            }         
            return false;
        }
    });

Right now its scroll and add item as well. How I stop ACTION_UP(selection Item) event after ACTION_MOVE(when scroll)?


Solution

  • I was applying this code for scroll gridview on OntouchListener and prevent scroll on select item. And work fine in my side. If anyone have better solution bring it on.

    My Code:

    private int moveCount=0;
    private boolean ignore = false;
    
    gridView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent me) {
    
                v.getParent().requestDisallowInterceptTouchEvent(true);
                int action = me.getActionMasked();  // MotionEvent types such as ACTION_UP, ACTION_DOWN
                float currentXPosition = me.getX();
                float currentYPosition = me.getY();
                int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);
                if (ignore && action == MotionEvent.ACTION_UP)
                    return false;
                switch (action) {
                    case (MotionEvent.ACTION_MOVE):
                        moveCount++;
                        Log.d(DEBUG_TAG, "Action was MOVE " + position);
                        if(moveCount>3) {
                            ignore = true;
                        }
    
                        break;
                    case (MotionEvent.ACTION_UP):
                        addItem(position);
                        Log.d(DEBUG_TAG, "Action was UP " + position);
                        return true;
    
                    case (MotionEvent.ACTION_DOWN):
                        Log.d(DEBUG_TAG, "Action was DOWN " + position);
                        moveCount=0;
                        ignore = false;
                        return true;
                    case (MotionEvent.ACTION_CANCEL):
                        addItem(position);
                        moveCount=0;
                        ignore = false;
                        gridView.setFocusable(true);
    
                        Log.d(DEBUG_TAG, "Action was CANCEL " + position);
                        return true;
                    case (MotionEvent.ACTION_OUTSIDE):
                        Log.d(DEBUG_TAG, "Movement occurred outside bounds " +
                                "of current screen element " + position);
                        return true;
    
                }
                Log.d("clickTouch=", "" + position);
                return false;
            }
        });