中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-28 23:45:37 來源:腳本之家 閱讀:808 作者:chun_soft 欄目:移動開發

1.概述

在實際開發中,我們經常遇到需要在ListView或RecycleView頭部添加ViewPager實現Banner輪播效果,并需要添加下拉刷新,上拉加載功能。

但,橫向滑動ViewPager時,稍微偏移就會失去焦點。

2.解決方案

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

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

(1)重寫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)
 * 用來子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嵌套RecycleView卡頓問題

ViewPager里面添加了三個Fragment,Fragment里面添加了RecycleView,發現ViewPager左右滑動切換非常不流暢,存在滑動沖突,使用外部攔截進行處理 so easy~~~

/**
* Created by magic on 2017/6/12 0012.外部攔截處理ViewPager嵌套RecycleView左右滑動切換Fragment卡頓問題
*/

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) ,因為ViewGroup中對事件攔截方法做了些基本處理。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

综艺| 石渠县| 方正县| 富锦市| 华坪县| 洪洞县| 沽源县| 朔州市| 阜新| 沅陵县| 连城县| 陈巴尔虎旗| 榆林市| 泗洪县| 稻城县| 河北区| 邵阳县| 祥云县| 铁力市| 焦作市| 吉首市| 广南县| 沙湾县| 余姚市| 汾阳市| 托克托县| 集安市| 务川| 山东| 新乡市| 新沂市| 库伦旗| 师宗县| 奉新县| 多伦县| 华蓥市| 宝清县| 西林县| 城步| 潢川县| 五家渠市|