Android listview viewpager解决冲突 滑动

Android listview viewpager
滑动 跳动 冲突解决

ListView中嵌套ViewPage有或者滑动手势冲突解决

在listview 上使用 addHeaderView 在第一栏添加 viewpager
当做header

如:

当触发 滑动事件 的时候容易引起 滑动冲突    (比如斜着滑动viewpager  的时候 listview会跳动)

特别是在  下拉刷新或者上拉加载 的时候 , 组件可能会传递到viewpager当中

查阅了很多的帖子  发现修改起来都非常麻烦

(1)解决方案

1. 针对viewpager 做了些修改

替换掉support.v4当中的viewpager即可:

package com.example.bz_viewpager;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;

/**
 * viewpage 和listview 相互冲突 将父view 传递到viewpage 里面
 *
 * 使用父类的方法 parent.requestDisallowInterceptTouchEvent(true);
 *
 * 当 requestDisallowInterceptTouchEvent 如果为true的时候 表示:父view 不拦截子view的touch 事件
 *
 * 这个方法只是改变flag
 *
 * @author baozi
 *
 */
public class DecoratorViewPager extends ViewPager {
	private ViewGroup parent;

	public DecoratorViewPager(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

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

	public void setNestedpParent(ViewGroup parent) {
		this.parent = parent;
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		if (parent != null) {
			parent.requestDisallowInterceptTouchEvent(true);
		}
		return super.dispatchTouchEvent(ev);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent arg0) {
		if (parent != null) {
			parent.requestDisallowInterceptTouchEvent(true);
		}
		return super.onInterceptTouchEvent(arg0);
	}

	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		if (parent != null) {
			parent.requestDisallowInterceptTouchEvent(true);
		}
		return super.onTouchEvent(arg0);
	}

}

2 . 在xml里面:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#f1f1f1" >

    <com.example.bz_viewpager.DecoratorViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:fadingEdge="none" />

</RelativeLayout>

3. 在代码里使用

将 viewpager 的父view传递到viewpager里面

调用:       vp.setNestedpParent((ViewGroup)vp.getParent()); 方法

如下:

		lv = (ListView) findViewById(R.id.lv);

		View header = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpage_layout, null);
		DecoratorViewPager vp = (DecoratorViewPager) header.findViewById(R.id.vp);
		vp.setNestedpParent((ViewGroup)vp.getParent());

		MyPagapter myPagapter = new MyPagapter(MainActivity.this);
		vp.setAdapter(myPagapter);
		lv.addHeaderView(header);

(2)解析:

viewgroup 当中有 一个 requestDisallowInterceptTouchEvent方法

这个方法只改变flag  当 view.requestDisallowInterceptTouchEvent 参数为true的时候

view 不会拦截其子控件的 触摸事件

    /**
     * Called when a child does not want this parent and its ancestors to
     * intercept touch events with
     * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)}.
     *
     * <p>This parent should pass this call onto its parents. This parent must obey
     * this request for the duration of the touch (that is, only clear the flag
     * after this parent has received an up or a cancel.</p>
     *
     * @param disallowIntercept True if the child does not want the parent to
     *            intercept touch events.
     */
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);

贴上源码:

    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
            // We're already in this state, assume our ancestors are too
            return;
        }

        if (disallowIntercept) {
            mGroupFlags |= FLAG_DISALLOW_INTERCEPT;
        } else {
            mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
        }

        // Pass it up to our parent
        if (mParent != null) {
            mParent.requestDisallowInterceptTouchEvent(disallowIntercept);
        }
    }

祝福大家每日精进

谢谢

时间: 2024-08-01 22:43:11

Android listview viewpager解决冲突 滑动的相关文章

Android ListView焦点事件冲突问题与解决

Android ListView对于单纯列表展示是很好用的,但是一旦牵扯到对listView进行操作就会遇到各种各样的问题.比如保存Checkbox状态与item复用的冲突.遇到可获取焦点的控件比如说button.edxttext等与listView本身的点击事件冲突等.对于后者,这里不研究原因,只提供解决方案. 如果listView之中只有button这样会抢夺焦点的控件,最好的建议是直接把button换成Textview,直接规避焦点问题. 如果有些产品经理要求在listview的item中

Android禁止ViewPager的左右滑动

转载请注明出处:http://blog.csdn.net/allen315410/article/details/40744287 有时候在开发中会遇到一些"诡异"的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的ViewPager禁止滑动吧,让被嵌入的XXView获得滑动事件好了.关于解决方法,网上也有很多说法,基本上是一致的,但是需要理解这个Android下的事件分发

114、Android禁止ViewPager的左右滑动

有时候在开发中会遇到一些“诡异”的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的ViewPager禁止滑动吧,让被嵌入的XXView获得滑动事件好了.关于解决方法,网上也有很多说法,基本上是一致的,但是需要理解这个Android下的事件分发机制才行,不明白事件分发机制的,上网查些资料看看,然后我这里也有简单的介绍,请参看博客Android自定义控件——侧滑菜单的下方. 怎样禁止V

Android ListView 和 ScrollView 冲突问题

近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等.然后下边是评论. 一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来.然后加入各个控件的内容就可以(对,感觉上有点像这个CSDN博客的编辑界面嘛),可是写出来之后发现ListView仅仅显示出了一个条目的高度.并且不能滑动,网上搜了一下发现原因是ScrollView和ListView都是可滑动的,把它们放在一块会有冲突.最后还是ScrollView获得了焦点.ListView不能滑

android listview + checkbox 列表上下滑动导致复选框状态丢失解决办法

以前为这个问题头疼很久.然后去忙其他事情.一直没有去整理,今天好不容易闲下来.就来整整这个listview + checkbox的问题吧 界面: listview_cell: 界面很简单,一个全屏的listview,cell很简单,一个textview一个checkbox activity: package com.example.testlistviewandcheckbox; import java.util.ArrayList; import java.util.List; import

Android ListView 侧滑效果实现(滑动展开、滑动删除)

转载请注明出处:http://blog.csdn.net/lonelyroamer/article/details/42439875 项目需要ListView滑动删除的效果,首先肯定是拿来主义,在网上搜了一遍,发现这样的东西真不少,比较有名的Github上的SwipeListView.但是个人尝试了一下,发现它的bug不少,并且达不到我想要的效果.于是又尝试了一下其他的例子,发现基本效果都有,但是都有不少问题.要么事件冲突,要么OnItemListView或者某个Button响应不了.没办法,只

android listview左右滑动分页(viewpager嵌套listview进行分页),焦点图带圆焦点

1.先上图后说话 2.代码 package com.example.exmp; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import and

改动ScrollView的滑动速度和解决ScrollView与ViewPager的冲突

话不多说,非常easy,能够从凝视中知道做法,直接上代码: 1.改动ScrollView的滑动速度: public class MyHorizontalScrollView extends HorizontalScrollView { public MyHorizontalScrollView(Context context) { super(context); } public MyHorizontalScrollView(Context context, AttributeSet attrs

修改ScrollView的滑动速度和解决ScrollView与ViewPager的冲突

话不多说,很简单,可以从注释中知道做法,直接上代码: 1.修改ScrollView的滑动速度: public class MyHorizontalScrollView extends HorizontalScrollView { public MyHorizontalScrollView(Context context) { super(context); } public MyHorizontalScrollView(Context context, AttributeSet attrs, i