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);
处理成功,其他的也是一样的道理。
以上是关于android下拉刷新和listview冲突解决方案的主要内容,如果未能解决你的问题,请参考以下文章
android ListView 做下拉刷新 下拉跳到第一项怎么解决
android ListView 做下拉刷新 下拉跳到第一项怎么解决
判断Listview滑到顶部的最精准方案,解决Listview设置EmptyView与SwipeRefreshLayout冲突
android解决ScrollView嵌套ListView不能下拉刷新