您的位置:首页 > 移动开发 > Android开发

android下拉刷新和listview冲突解决方案

2016-12-10 09:51 246 查看
相关文章:

《下拉刷新?我看好MaterialRefreshLayout!》

常见的下拉刷新都是带有一些自定义的listview、gridview和webview,我们导包直接用就行了,但是为什么他们要自定义一些常用的控件呢?直接在外边套用不行吗?类似于SwipeLayout,他是在ViewGroup的层面上动刀,可以嵌套任何的组件的,那么我们先去看一个效果你就知道了。

效果图:



我之前用的都是封装库,没有怎么碰到过这种情况,但是自己写了一个下拉刷新之后,碰到这种问题,不用思考,一看就是下拉刷新和listview滑动冲突了,你是否明白了我在文章开头说的那个问题了?

问题分析:

出现这个问题,首先考虑的就是因为下拉刷新中嵌套的listview,根据View的分发机制可以知道,内部的view的时间最终是返回到外层的ViewGroup中进行处理得,说白了,如果不作处理的话,下拉刷新这个ViewGroup的会代替listview处理触摸事件。

问题解决:

在ListView中监听滑动是否在头部,如果不在头部拦截触摸机制ListView自己处理行为,如果滑到了头部则放行触摸机制放行给外层下拉刷新来处理行为。

代码:

自定义ListView拦截,在onInterceptTouchEvent中拦截

/**
* 自定义RefreshListView
*/
public class RefreshListView extends ListView {
public PullListView(Context context) {
super(context);
}

public PullListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public PullListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//判断是否滑动到顶部了
if (getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0) {//到顶部了
//返回触摸事件
getParent().requestDisallowInterceptTouchEvent(false);
} else {//没有到头部
//拦截触摸事件
getParent().requestDisallowInterceptTouchEvent(true);
}
return super.onInterceptTouchEvent(ev);
}
}


在你的xml文件中使用这个自定义的listview,然后执行代码,看效果:



处理成功,其他的也是一样的道理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: