Detecting the scrolling direction in the adapter (up/down)

后端 未结 11 1554
臣服心动
臣服心动 2020-12-01 00:38

I am trying to mimic the Google Plus application in my project, as it seems to be the reference now.

The listview effect when scrolling is really nice and I would li

相关标签:
11条回答
  • 2020-12-01 01:08
    view.setOnTouchListener(new View.OnTouchListener() {
    
            private long startClickTime;
            float y0 = 0;
            float y1 = 0;
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
    
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    y0 = motionEvent.getY();
                    startClickTime = System.currentTimeMillis();
    
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) {
    
                        // Touch was a simple tap. Do whatever.
    
                    } else {
                        y1 = motionEvent.getY();
                        // Touch was a not a simple tap.
                        if (y1 - y0 > 50) {
                            // this is down
                        } else if (y1 - y0 < 50) {
                            Log.d("daniY", "-");
                            // this is up
                        }
                    }
    
                }
    
                return true;
            }
    
        });
    

    this worked for me, and this will work on detecting the direction of scrolling on all views i think.

    0 讨论(0)
  • 2020-12-01 01:09

    Assign an OnScrollListener to your ListView. Create a flag which indicates whether the user is scrolling up or down. Set an appropriate value to the flag by checking if the current first visible item position equals to more or less than the previous first visible item position. Put that check inside onScrollStateChanged().

    Sample code:

    private int mLastFirstVisibleItem;
    private boolean mIsScrollingUp;
    
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        final ListView lw = getListView();
    
        if (view.getId() == lw.getId()) {
            final int currentFirstVisibleItem = lw.getFirstVisiblePosition();
    
            if (currentFirstVisibleItem > mLastFirstVisibleItem) {
                mIsScrollingUp = false;
            } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
                mIsScrollingUp = true;
            }
    
            mLastFirstVisibleItem = currentFirstVisibleItem;
        } 
    }
    

    Check if mIsScrollingUp is true or false in getView(), and assign the animations accordingly.

    0 讨论(0)
  • 2020-12-01 01:11

    The accepted answer doesn't really "detect" scrolling up or down. It won't work if the current visible item is really huge. Using onTouchListener is the way to go.

    This is the code snippet I used:

    listView.setOnTouchListener(new View.OnTouchListener() {
        float initialY, finalY;
        boolean isScrollingUp;
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = MotionEventCompat.getActionMasked(event);
    
            switch(action) {
                case (MotionEvent.ACTION_DOWN):
                    initialY = event.getY();
                case (MotionEvent.ACTION_UP):
                    finalY = event.getY();
    
                    if (initialY < finalY) {
                        Log.d(TAG, "Scrolling up");
                        isScrollingUp = true;
                    } else if (initialY > finalY) {
                        Log.d(TAG, "Scrolling down");
                        isScrollingUp = false;
                    }
                default:
            }
    
            if (isScrollingUp) {
                // do animation for scrolling up
            } else {
                // do animation for scrolling down
            }
    
            return false; // has to be false, or it will freeze the listView
        }
    });
    
    0 讨论(0)
  • 2020-12-01 01:12

    This is the easiest and simplest method I came across. And it works like a charm.

    view.addOnScrollListener(new View.OnScrollListener() {
                    @Override
                    public void onScrolled(@NonNull View view, int dx, int dy) {
                        if (dy > 0) {
                            //Scrolling down
                        } else if (dy < 0) {
                            //Scrolling up
                        }
                    }
                });
    
    0 讨论(0)
  • 2020-12-01 01:14

    More complex solution (working with long items height in listview)

    1. Create custom listview

      public class ScrollDetectingListView extends ListView {
          public ScrollDetectingListView(Context context) {
              super(context);
          }
      
          public ScrollDetectingListView(Context context, AttributeSet attrs) {
              super(context,attrs);
          } 
      
          public ScrollDetectingListView(Context context, AttributeSet attrs, int defStyle) {
              super(context, attrs, defStyle);
          }
      
          //we need this protected method for scroll detection
          public int getVerticalScrollOffset() {
              return computeVerticalScrollOffset();
          }
      }
      
    2. Override onScroll

          listView.setOnScrollListener(new AbsListView.OnScrollListener() {
      
          private int mInitialScroll = 0;
      
          @Override
          public void onScrollStateChanged(AbsListView view, int scrollState) {
      
          }
      
          @Override
          public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
              int scrolledOffset = listView.getVerticalScrollOffset();
              if (scrolledOffset!=mInitialScroll) {
                  //if scroll position changed
                  boolean scrollUp = (scrolledOffset - mInitialScroll) < 0;
                  mInitialScroll = scrolledOffset;
              }
          }
          });
      
    0 讨论(0)
提交回复
热议问题