Listview嵌套Viewpager滑动冲突解决方案
问题:上下滑动和左右滑动冲突问题
解决方案:自定义viewpager,修改viewpager事件拦截机制。
当事件传递到viewpager时候,让他的父布局不要进行事件拦截,而是交给viewpager自己处理。
我们使用requestDisallowInterceptTouchEvent()方法进行设置。
具体操作:
1 自定义viewpager
- import android.content.Context;
- import android.support.v4.view.ViewPager;
- import android.util.AttributeSet;
- import android.util.Log;
- 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) {
- Log.i("dispatch_touch_event","---"+ev.getAction());
- }
- return super.dispatchTouchEvent(ev);
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (parent != null) {
- Log.i("onintercepte_touch_eve","---"+ev.getAction());
- }
- return super.onInterceptTouchEvent(ev);
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (parent != null) {
- Log.i("on_touch_event","---"+ev.getAction());
- parent.requestDisallowInterceptTouchEvent(true);
- }
- return super.onTouchEvent(ev);
- }
- }
- <com.demo.widget.DecoratorViewPager
- android:id="@+id/rec_viewpager"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- viewPager = (DecoratorViewPager) findViewById(R.id.rec_viewpager);
- viewPager.setAdapter(new myAdapter());
- viewPager.setNestedpParent((ViewGroup)viewPager.getParent());
4 如果需要理解以上做法,需要了解android事件拦截基础知识。