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,然后执行代码,看效果:



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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anonymous-OS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值