文章概述:
本篇文章記錄晚碾,解決github上開源框架android-Ultra-Pull-To-Refresh內(nèi)嵌套viewpager的滑動(dòng)沖突問題晒哄。
問題描述:
liaohuqiu 開源的 android-Ultra-Pull-To-Refresh 下拉刷新框架菱皆,在使用時(shí),會(huì)經(jīng)常遇到嵌套banner的使用場(chǎng)景愤估,即:子ViewGroup嵌套ViewPager使用搂妻,例如:
<com.vic.bmar.widgets.PtrClassicRefreshLayout
android:id="@+id/pcfl_hot"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey_color"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- 這里的FrameLayout用作放ViewPager的容器 -->
<FrameLayout
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="160dp"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</com.vic.bmar.widgets.PtrClassicRefreshLayout>
PtrClassicRefreshLayout是PtrFrameLayout的子類议慰,默認(rèn)實(shí)現(xiàn)了頭部刷 新時(shí)的樣式蠢古,可以直接拿來使用。
這時(shí)候會(huì)與ViewPager發(fā)生滑動(dòng)沖突别凹,ViewPager左右很難滑動(dòng)草讶,作者已經(jīng)給出了一種解決方法:
//左右滑動(dòng)時(shí)刷新控件禁止掉
pcflFrameLayout.disableWhenHorizontalMove(true);
這樣做ViewPager可以左右滑動(dòng)了,但是左右滑動(dòng)有時(shí)還是不好滑動(dòng)炉菲,并且堕战,ViewPager滑動(dòng)時(shí)經(jīng)常會(huì)觸發(fā)PtrFrameLayout的刷新樣式坤溃,用戶體驗(yàn)很差。
解決方案
1. 重寫ViewPager
public class BannerViewPager extends ViewPager {
private ViewGroup parent;
public BannerViewPager(Context context) {
super(context);
parent= (ViewGroup) getParent();
}
public BannerViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
parent= (ViewGroup) getParent();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
if (parent != null) {
//禁止上一層的View不處理該事件,屏蔽父組件的事件
parent.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_CANCEL:
if (parent != null) {
//攔截
parent.requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}
2. 重寫PtrClassicRefreshLayout
這里為了方便嘱丢,就不自定義刷新樣式薪介,直接使用PtrClassicRefreshLayout刷新樣式,如果想重寫刷新樣式越驻,可以繼承PtrFrameLayout汁政。
public class PtrClassicRefreshLayout extends PtrClassicFrameLayout {
private boolean disallowInterceptTouchEvent = false;
public PtrClassicRefreshLayout(Context context) {
super(context);
}
public PtrClassicRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PtrClassicRefreshLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
disallowInterceptTouchEvent = disallowIntercept;
super.requestDisallowInterceptTouchEvent(disallowIntercept);
}
@Override
public boolean dispatchTouchEvent(MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_UP:
//解除刷新的屏蔽
this.requestDisallowInterceptTouchEvent(false);
break;
}
if (disallowInterceptTouchEvent) {
//事件向下分發(fā)給子控件,子控件會(huì)屏蔽掉父控件的刷新
return dispatchTouchEventSupper(e);
}
return super.dispatchTouchEvent(e);
}
}
直接copy這兩個(gè)自定義組件的代碼使用缀旁,再加上作者推薦的設(shè)置:
pcflFrameLayout.disableWhenHorizontalMove(true);
即可解決android-Ultra-Pull-To-Refresh下拉刷新框架與viewpager使用沖突問題.