希望得到的效果是ListView不能滚动,但是最大的问题在与ListView Item还必有点击事件,如果不需要点击事件那就简单了,直接设置ListView.setEnable(false);
如果还需要点击事件,滚动与点击都是在ListView Touch处理机制管理。
ListView点击事件是复用ViewGroup的处理逻辑,当用户点击视图并且按下与抬起手指之间移动距离很小,满足点击事件的时间长度限制,就会触发点击事件。
ListView滚动事件是自己处理,有两个判断条件,当用户触发move事件并且滑动超过touch slop距离 或者 滑动速度超过阀值都会判定为滚动事件。
1 import android.content.Context; 2 import android.util.AttributeSet; 3 import android.view.MotionEvent; 4 import android.widget.ListView; 5 6 public class ScrollDisabledListView extends ListView { 7 8 private int mPosition; 9 10 public ScrollDisabledListView(Context context) {11 super(context);12 }13 14 public ScrollDisabledListView(Context context, AttributeSet attrs) {15 super(context, attrs);16 }17 18 public ScrollDisabledListView(Context context, AttributeSet attrs, int defStyle) {19 super(context, attrs, defStyle);20 }21 22 @Override23 public boolean dispatchTouchEvent(MotionEvent ev) {24 final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK;25 26 if (actionMasked == MotionEvent.ACTION_DOWN) {27 // 记录手指按下时的位置28 mPosition = pointToPosition((int) ev.getX(), (int) ev.getY());29 return super.dispatchTouchEvent(ev);30 }31 32 if (actionMasked == MotionEvent.ACTION_MOVE) {33 // 最关键的地方,忽略MOVE 事件34 // ListView onTouch获取不到MOVE事件所以不会发生滚动处理35 return true;36 }37 38 // 手指抬起时39 if (actionMasked == MotionEvent.ACTION_UP40 || actionMasked == MotionEvent.ACTION_CANCEL) {41 // 手指按下与抬起都在同一个视图内,交给父控件处理,这是一个点击事件42 if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) {43 super.dispatchTouchEvent(ev);44 } else {45 // 如果手指已经移出按下时的Item,说明是滚动行为,清理Item pressed状态46 setPressed(false);47 invalidate();48 return true;49 }50 }51 52 return super.dispatchTouchEvent(ev);53 }54 }
(转自:http://blog.csdn.net/androiddevelop/article/details/38815493)
原标题:Android 实现ListView不可滚动效果
关键词:Android