找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1158|回复: 0
收起左侧

[Android] Android 实现ListView不可滚动效果

[复制链接]

13

主题

5

精华

156

积分

资深会员

Rank: 2

积分
156
发表于 3-11-2015 01:04 AM | 显示全部楼层 |阅读模式

亲!马上注册或者登录会查看更多内容!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Android 实现ListView不可滚动效果

希望得到的效果是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     @Override
23     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_UP
40                 || 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 }

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表