欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中RecycleView與ViewPager沖突的解決方法及原理

 更新時(shí)間:2018年07月03日 15:39:50   作者:chun_soft  
這篇文章主要給大家介紹了關(guān)于Android中RecycleView與ViewPager沖突的解決方法及原理的相關(guān)資料,以及ViewPager嵌套R(shí)ecycleView卡頓問(wèn)題的處理方法,文中通過(guò)示例代碼介紹的非常狎昵,需要的朋友可以參考下

1.概述

在實(shí)際開(kāi)發(fā)中,我們經(jīng)常遇到需要在ListView或RecycleView頭部添加ViewPager實(shí)現(xiàn)Banner輪播效果,并需要添加下拉刷新,上拉加載功能。

但,橫向滑動(dòng)ViewPager時(shí),稍微偏移就會(huì)失去焦點(diǎn)。

2.解決方案

我們知道事件攔截的順序,父ViewGroup先接收到攔截,再傳遞給子ViewGroup 或子View。事件的處理順序是,子ViewGroup 或子View先處理,若子ViewGroup處理了,父ViewGroup就不用處理,若子ViewGroup未處理,則傳給父ViewGroup處理。

根據(jù)事件攔截原理,ViewPager和RecycleView相互沖突,RecycleView相當(dāng)于父ViewGroup,ViewPager相當(dāng)于子View,ViewPager和RecycleView相互沖突,將父View傳到ViewPager里面處理,重寫(xiě)View Pager。使用父類方法requestDisallowInterceptTouchEvent(true) ,用來(lái)子View告訴父容器不要攔截我們的事件的。

(1)重寫(xiě)ViewPager

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

/**
 * Developer:chunsoft on 2016/10/31 16:04
 * Email:chun_soft@qq.com
 * Content:viewPager和RecycleView相互沖突,將父View傳到ViewPager里面
 * 使用父類方法requestDisallowInterceptTouchEvent(true)
 * 用來(lái)子View告訴父容器不要攔截我們的事件的
 */

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 ev) {
 if (parent != null){
  parent.requestDisallowInterceptTouchEvent(true);
 }
 return super.onInterceptTouchEvent(ev);
 }

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

(2)在Activity中:

DecoratorViewPager mPager = (DecoratorViewPager) mHeaderView.findViewById(R.id.viewpager);

 mPager.setNestedpParent((ViewGroup) mPager.getParent());

(3)在布局文件中:

<com.chunsoft.baseframework.utils.view.DecoratorViewPager
 android:id="@+id/viewpager"
 android:layout_width="match_parent"
 android:layout_height="180dp" />

處理ViewPager嵌套R(shí)ecycleView卡頓問(wèn)題

ViewPager里面添加了三個(gè)Fragment,F(xiàn)ragment里面添加了RecycleView,發(fā)現(xiàn)ViewPager左右滑動(dòng)切換非常不流暢,存在滑動(dòng)沖突,使用外部攔截進(jìn)行處理 so easy~~~

/**
* Created by magic on 2017/6/12 0012.外部攔截處理ViewPager嵌套R(shí)ecycleView左右滑動(dòng)切換Fragment卡頓問(wèn)題
*/

public class MyViewPager extends ViewPager {

float x, y;

public MyViewPager(Context context) {
super(context);
}

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

@Override
public boolean onInterceptHoverEvent(MotionEvent event) {

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
return super.onInterceptHoverEvent(event);
case MotionEvent.ACTION_MOVE:
if (Math.abs(x - event.getX()) > Math.abs(y - event.getY()))
return true;
else return false;
case MotionEvent.ACTION_UP:
return super.onInterceptHoverEvent(event);
}
return super.onInterceptHoverEvent(event);
}
}

注意:ACTION_DOWN和ACTION_UP中不要直接返回false 而要返回super.onInterceptHoverEvent(event) ,因?yàn)閂iewGroup中對(duì)事件攔截方法做了些基本處理。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論