Android listview viewpager滑動 跳動 衝突解決
ListView中嵌套ViewPage有或者滑動手勢衝突解決
在listview 上使用 addHeaderView 在第一欄添加 viewpager 當作header html
如:java
![](http://static.javashuo.com/static/loading.gif)
當觸發 滑動事件 的時候容易引發 滑動衝突 (好比斜着滑動viewpager 的時候 listview會跳動)android
特別是在 下拉刷新或者上拉加載 的時候 , 組件可能會傳遞到viewpager當中ide
查閱了不少的帖子 發現修改起來都很是麻煩 this
(1)解決方案
1. 針對viewpager 作了些修改
替換掉support.v4當中的viewpager便可:spa
- 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;
-
- public class DecoratorViewPager extends ViewPager {
- private ViewGroup parent;
-
- public DecoratorViewPager(Context context) {
- super(context);
-
- }
-
- 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裏面 .net
調用: vp.setNestedpParent((ViewGroup)vp.getParent()); 方法code
以下:xml
- 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方法htm
這個方法只改變flag 當 view.requestDisallowInterceptTouchEvent 參數爲true的時候
view 不會攔截其子控件的 觸摸事件
- public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);
貼上源碼:
- public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
-
- if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
-
- return;
- }
-
- if (disallowIntercept) {
- mGroupFlags |= FLAG_DISALLOW_INTERCEPT;
- } else {
- mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
- }
-
-
- if (mParent != null) {
- mParent.requestDisallowInterceptTouchEvent(disallowIntercept);
- }
- }