如何检测列表视图是否在android中向上或向下滚动?

时间:2012-03-09 06:30:57

标签: android listview scroll

有没有办法确定列表视图是向上还是向下滚动?

OnScrollListener在这种情况下帮助我。

提前致谢!

6 个答案:

答案 0 :(得分:14)

这是一个简单的实现:

lv.setOnScrollListener(new OnScrollListener() {
        private int mLastFirstVisibleItem;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

            if(mLastFirstVisibleItem<firstVisibleItem)
            {
                Log.i("SCROLLING DOWN","TRUE");
            }
            if(mLastFirstVisibleItem>firstVisibleItem)
            {
                Log.i("SCROLLING UP","TRUE");
            }
            mLastFirstVisibleItem=firstVisibleItem;

        }
    });

答案 1 :(得分:4)

ScrollViews中有一种报告卷轴移动的方法。它被称为onScrollChanged()。但是,它被声明为protected,因此您必须创建一个包装类才能获得访问权限。有关该方法的用法,请查看android docs。

首先,创建一个接口以公开受保护的方法

public interface OnScrollListener {
void onScrollChanged(int x, int y, int oldx, int oldy);
}

然后,创建您的包装器并扩展ScrollView

public class ReportingScrollView extends ScrollView {
private OnScrollListener onScrollListener = null;

public ReportingScrollView(Context context) {
    super(context);
}

public ReportingScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public ReportingScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setOnScrollListener(OnScrollListener onScrollListener) {
    this.onScrollListener = onScrollListener;
}

@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
    super.onScrollChanged(x, y, oldx, oldy);
    if (onScrollListener != null) {
        onScrollListener.onScrollChanged(x, y, oldx, oldy);
    }
}
}

最后,将它包含在您的XML布局中,就像自定义视图一样,并像往常一样附加侦听器。

<your.package.ReportingScrollView />

scrollingandtrolling.setOnScrollListener(new OnScrollListener() {...});

答案 2 :(得分:1)

简单易用的解决方案。

private int lastPosition = -1;

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
        {
            if(lastPosition == firstVisibleItem)
            {
                return;
            }

            if(firstVisibleItem > lastPosition)
            {
                Logger.print("Going Down");
            }
            else
            {
                Logger.print("Going Up");
            }

            lastPosition = firstVisibleItem;
        }

答案 3 :(得分:1)

谁仍然在寻找kotlin的答案,这适用于它

MainListView.setOnScrollListener(object :AbsListView.OnScrollListener {
     // var VisibleItem: Int = 0
      override fun onScroll(p0: AbsListView?, FirstVisibleItem: Int, i2: Int, i3: Int) {
      /*   
      if(VisibleItem < FirstVisibleItem)
      {
      Toast.makeText(applicationContext,"Scrolling Down",Toast.LENGTH_SHORT).show()
          fab.hide()
      }
      if(VisibleItem >FirstVisibleItem)
      {
          fab.show()
          Toast.makeText(applicationContext,"Scrolling Up",Toast.LENGTH_SHORT).show()
      }
          VisibleItem=FirstVisibleItem;
  */
      }
      override fun onScrollStateChanged(p0: AbsListView?, p1: Int) {
          if (p1 == 1) {
              fab.hide()
          } else {
              fab.show()
          }
      }

  })
}

取消注释以使用替代方法。

答案 4 :(得分:0)

Some Noob Student给出的解决方案很好:你必须创建一个包装器来使用受保护的onScrollChanged(int x,int y,int oldx,int oldy)方法,这种方法比标准的AbsListView.OnScrollListener更频繁地触发.onScrollStateChanged(AbsListView视图,int scrollState)。

不幸的是onScrollChanged()总是返回0作为参数,无论我如何滚动,并且似乎只在滚动结束时检测到,到达列表的顶部或底部。

所以我使用下面的代码来检测滚动的正确方向:它使用第一个可见项的getTop(),但也使用它的位置来理解第一个项目何时不再可见;在此项目转换期间,滚动方向由项目位置本身给出。

        @Override
        public void onScrollChanged(int x, int y, int oldx, int oldy) {

            if(listView.getChildAt(0) != null) {
                int scrollingDir = NO_SCROLLING;
                int firstChildTop = listView.getChildAt(0).getTop();

                if (listView.getFirstVisiblePosition() == mLastFirstVisiblePosition) {
                    if (mLastFirstChildTop < firstChildTop) {
                        //Scrolling DOWN
                        scrollingDir = SCROLLING_DOWN;
                    } else if (mLastFirstChildTop > firstChildTop) {
                        //Scrolling UP
                        scrollingDir = SCROLLING_UP;
                    }
                } else if(listView.getFirstVisiblePosition() > mLastFirstVisiblePosition) {
                    //Scrolling UP
                    scrollingDir = SCROLLING_UP;
                } else {
                    //Scrolling DOWN
                    scrollingDir = SCROLLING_DOWN;
                }
                mLastFirstVisiblePosition = listView.getFirstVisiblePosition();
                mLastFirstChildTop = firstChildTop;

                switch(scrollingDir) {
                    case SCROLLING_DOWN:
                        //Your DOWN scrolling code here
                        break;

                    case SCROLLING_UP:
                        //Your UP scrolling code here
                        break;

                    default:
                    case NO_SCROLLING:
                        break;
                }
            }
        }

答案 5 :(得分:0)

list.setOnScrollListener(new OnScrollListener() {
        int last_item;
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if(last_item<firstVisibleItem+visibleItemCount-1){
                System.out.println("List is scrolling upwards");
            }
            else if(last_item>firstVisibleItem+visibleItemCount-1){
                System.out.println("List is scrolling downwards");
            }
             last_item = firstVisibleItem+visibleItemCount-1;
        }
    });

这里基于最后一个可见项目,我决定列表是上升还是下降