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

Posted Anonymous-OS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,然后执行代码,看效果:



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


以上是关于android下拉刷新和listview冲突解决方案的主要内容,如果未能解决你的问题,请参考以下文章

android ListView 做下拉刷新 下拉跳到第一项怎么解决

android ListView 做下拉刷新 下拉跳到第一项怎么解决

判断Listview滑到顶部的最精准方案,解决Listview设置EmptyView与SwipeRefreshLayout冲突

android解决ScrollView嵌套ListView不能下拉刷新

android viewpager滑动与slidingpanelayout冲突怎么解决

Android 解决下拉刷新控件和ScrollVIew的滑动冲突问题。