91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

大渡口区| 吉首市| 玉树县| 舟山市| 旬邑县| 丽江市| 若尔盖县| 南京市| 海淀区| 楚雄市| 蓬莱市| 闸北区| 镇远县| 太仆寺旗| 信宜市| 阜新| 友谊县| 年辖:市辖区| 冷水江市| 乃东县| 刚察县| 旅游| 玛纳斯县| 桦甸市| 阜南县| 霸州市| 高淳县| 赤城县| 内丘县| 临城县| 清河县| 甘泉县| 曲阜市| 凤台县| 南安市| 陵川县| 永昌县| 沅陵县| 新巴尔虎右旗| 库伦旗| 龙里县|