解决ListView当中还有ListView onItemClick点击事件问题

来源:互联网 发布:java获取ad域用户信息 编辑:程序博客网 时间:2024/06/06 02:25

很久没有写帖子了 一直挺忙

但是这个帖子 惦记好久了  应该记录一下 

一张图描述 使用场景


如图所示 我外层是一个 可上拉刷新 下拉加载更多的的控件ListView 里面是一个 可动态分配高度的ListView  蓝色部分

我再外层设置OnItemClick的时候  只有订单日期那一条可以响应 事件 

我想要整个Item除了按钮 都可以进行响应 那么需要把里面ListView的事件截获  屏蔽掉   因为里面控件 按钮等优先级比较高 (不理解可以稍微百度一下)

那么如何屏蔽掉里面ListView 的响应机制呢? 上代码

public class NBDispatchListView extends NBListView {    public NBDispatchListView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public NBDispatchListView(Context context) {        super(context);    }    public NBDispatchListView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    @Override    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,                MeasureSpec.AT_MOST);        super.onMeasure(widthMeasureSpec, expandSpec);    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        return super.onTouchEvent(ev);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return super.onInterceptTouchEvent(ev);    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        return false;    }}
这是我基于 可在ScroolView当中使用的ListView创建的一个 listView

最关键的在于 

1)public boolean dispatchTouchEvent(MotionEvent ev)  这个方法用来分发TouchEvent

2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent

3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

这三个方法

当你拦截不好用的时候记得修改 分发方法  

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由  

dispatchTouchEvent 方法进行分发,

如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的

interceptTouchEvent 方法来决定是否要拦截这个事件,

如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。


1 0
原创粉丝点击