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

相关文章:

《下拉刷新?我看好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,然后执行代码,看效果:



处理成功,其他的也是一样的道理。


猜你喜欢

转载自blog.csdn.net/u014752325/article/details/53556234
今日推荐