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);
- }
- }
Demo 下载地址:
http://download.csdn.net/detail/aaawqqq/8447693
祝福大家每日精进
谢谢
原文地址:http://blog.csdn.net/aaawqqq/article/details/43824631
相关推荐
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
4. **使用第三方库**:“ListViewPager”可能引用了一些第三方库,如`androidx.viewpager.widget.ViewPager`的子类,这些库可能已经解决了滑动冲突问题。例如,`androidx.recyclerview.widget.RecyclerView`在某些...
自定义的ViewPager,可以实现页面之前的相互切换,可以...同时该ViewPager解决了传统ViewPager和ListView,ScrollView滑动冲突问题,当然ListView的滑动冲突实在ScrollView中解决的。实践表明,滑动切换效果较好。
效果:滑动listview删除,滑动非listview区域viewpage翻页"描述的就是这样一个功能:在ViewPager中嵌套了一个ListView,ListView支持滑动删除,而当滑动到ListView之外的区域时,ViewPager能够正常翻页。这样的设计...
在Android开发中,ListView和ViewPager是两种常用的控件,ListView用于显示列表数据,而ViewPager则用于实现页面的左右滑动切换。然而,在实际应用中,当我们尝试将ListView嵌入到一个可以横向滚动的布局(如...
在这种场景下,"Android三层滑动控件显示冲突和ViewPager高度动态调整的解决方案Demo"是一个非常实用的示例,它解决了ListView、ViewPager以及Fragment三层嵌套时可能出现的滑动冲突问题,并且能够动态调整ViewPager...
在Android应用开发中,滑动冲突是一个常见的问题,特别是在使用诸如ViewPager、ScrollView等滚动视图时。滑动冲突主要分为两种类型:同方向滑动冲突和不同方向滑动冲突。 1. 同方向滑动冲突:例如,当一个...
本篇文章将详细探讨如何解决ScrollView、ListView和ViewPager之间的滑动冲突,以及优化这种组合的使用。 首先,ScrollView是一个可以包含单个直接子视图的垂直滚动容器。它可以容纳较大的内容,当内容超出屏幕时,...
下面我们就来看一下如何通过自定义 `ListView` 来解决 `ListView` 和 `ViewPager` 滑动冲突的问题。 #### 自定义 ListView 实现原理 本案例中,开发者创建了一个名为 `Defind_Listview` 的自定义 `ListView` 类,...
1. 冲突的滑动手势:由于两者都有滑动操作,可能会导致手势冲突,用户在滑动ListView时误触发ViewPager的滑动。解决这个问题的方法是自定义ViewPager,重写onInterceptTouchEvent和onTouchEvent方法,限制ViewPager...
1、为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下: package com.example.testa; import android.content.Context; import a
6. 最后,测试和调试:确保在各种设备和屏幕尺寸上都能正常工作,同时注意滑动冲突的解决,避免ListView和ViewPager之间的滑动手势相互干扰。 通过这样的组合,我们可以创建出更富有层次感和交互性的界面,提升用户...
当ViewPager中的Fragment包含可滚动的内容(如ScrollView或ListView)时,可能会出现上下滑动与ViewPager的左右滑动冲突。为了解决这个问题,我们需要自定义一个ViewPager,覆盖其`onInterceptTouchEvent...
为了解决这个问题,我们需要重写ListView的onInterceptTouchEvent()和onTouchEvent()方法,让ListView只在手指按下时拦截事件,手指移动时释放事件,这样就可以将滑动事件传递给ViewPager。 以下是一个简单的示例...
滑动冲突通常发生在两个或多个可滑动的视图(如ScrollView、HorizontalScrollView、ViewPager等)重叠或者相邻时,用户可能尝试同时在这些视图上滑动,但系统无法准确判断用户的滑动意图,导致用户体验下降。...
总的来说,处理`ViewPage`与`ListView`的滑动冲突是一个常见的Android开发问题,解决这个问题需要对Android的触摸事件处理机制有深入的理解。通过自定义滑动侦测、隔离事件或利用现有的库,我们可以构建出既流畅又...
然而,在某些特定场景下,我们可能需要禁止ViewPager的滑动功能,例如当ViewPager内部包含可滚动的视图(如ListView或另一个ViewPager)时,避免滑动冲突。本文将详细介绍如何在Android中实现禁止ViewPager滑动。 ...
注意,为了确保性能和用户体验,我们需要合理处理ListView的滚动事件,防止ListView和ViewPager之间的滑动冲突。可以通过监听ListView的滚动状态并在适当时机禁止ViewPager的滑动,或者使用第三方库如`androidx....
在Android开发中,滑动冲突是一个常见的问题,特别是在使用各种可滚动组件如ListView、ScrollView、ViewPager等时。标题提到的"BounceView"是一个专门解决滑动冲突问题的开源项目,它旨在提供更流畅的用户体验,使得...
在Android开发中,ScrollView、ListView和ViewPager是三个非常常见的组件,它们各自有着不同的用途和功能。当需要在同一个布局中同时使用这三个组件时,开发者可能会遇到一些挑战,因为它们本质上都是处理滚动行为的...