准确判断listview上下滚动
项目碰到一个需要根据listview上下滚动显示/隐藏tab的问题,挺常见的一个需求,想网上copy一个代码直接用缺发现大部分的实现都不准确。
比如用OnScrollListener里的第一个可见项的index来判断,如果item比较大,滚动了半天还没滚出这个item呢?
所以干脆自己写了一个,给listview设置OnTouchListener,代码如下。关键点在于如果按下的时候点击的地方是item里的某个view,listview的ACTION_DOWN可能就不会触发
boolean isTabShow = true; float downY = 0; // 拖动listview时,如果点击到的地方是item里的一些view,可能出现ACTION_DOWN触发不了的问题。
// 利用isActionDown,当为false时就触发了ACTION_MOVE,第一个action需要当成ACTION_DOWN处理 boolean isActionDown = false; OnTouchListener onTouchListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: isActionDown = true; downY = event.getY(); Use.trace("onTouchListener", "downY:" + downY); break; case MotionEvent.ACTION_MOVE: if (!isActionDown) { // 当为false时就触发了ACTION_MOVE,第一个action需要当成ACTION_DOWN处理 isActionDown = true; downY = event.getY(); Use.trace("onTouchListener", "downY:" + downY + " no action down"); } else { float currentY = event.getY(); Use.trace("onTouchListener", "downY:" + downY + " currentY::" + currentY + " currentY - downY:" + (currentY - downY)); if (currentY - downY < -20 && isTabShow) { // 向下,隐藏 isTabShow = false; Use.trace("onTouchListener", "downY:" + downY + " currentY::" + currentY + " currentY - downY:" + (currentY - downY) + " hide"); } else if (currentY - downY > 20 && !isTabShow) { // 向上,显示 isTabShow = true; Use.trace("onTouchListener", "downY:" + downY + " currentY::" + currentY + " currentY - downY:" + (currentY - downY) + " show"); } } break; case MotionEvent.ACTION_UP: isActionDown = false;// isActionDown重置 break; default: break; } return false; } };