准确判断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; } };

 

posted @ 2015-03-12 10:37  幻次元  阅读(1032)  评论(0编辑  收藏  举报