ViewPager2滑动冲突的解决方法_Android

来源:脚本之家  责任编辑:小易  

ViewPager2滑动冲突解决,供大家参考,具体内容如下

本文章对ViewPager2的滑动冲突没有提供完善的解决方案,仅为巩固解决滑动冲突方面的知识

首先看看没有解决滑动冲突时写的demo:

MainActivity.java

package com.example.banner

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.viewpager2.widget.ViewPager2

class MainActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_main)
 val viewPager2 = findViewById<ViewPager2>(R.id.viewpager2outside)
 val myAdapter = OutsideAdapter()
 viewPager2.adapter = myAdapter
 }
}

InnerAdapter

package com.example.banner

import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class InnerAdapter : RecyclerView.Adapter<InnerAdapter.PagerViewHolder>() {
 private var mList: List<Int> = ArrayList()
 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerViewHolder {
 val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_page, parent, false)
 return PagerViewHolder(itemView)
 }

 override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {
 holder.bindData(mList[position])
 }

 fun setList(list: List<Int>) {
 mList = list
 }

 override fun getItemCount(): Int {
 return mList.size
 }
 // ViewHolder需要继承RecycleView.ViewHolder
 class PagerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
 private val mTextView: TextView = itemView.findViewById(R.id.tv_text)
 private var colors = arrayOf("#41F1E5","#8D41F1","#FF99CC","#41F1E5")

 fun bindData(i: Int) {
  mTextView.text = i.toString()
  mTextView.setBackgroundColor(Color.parseColor(colors[i]))
 }
 }
}

OutsideAdapter

package com.example.banner

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2

class OutsideAdapter() : RecyclerView.Adapter<OutsideAdapter.PagerViewHolder>() {
 class PagerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
 private val mPagerView: ViewPager2 = itemView.findViewById(R.id.viewpager2inner)
 fun bindData() {
  val data = listOf(0, 1, 2, 3)
  val myAdapter = InnerAdapter()
  myAdapter.setList(data)
  mPagerView.adapter = myAdapter
 }
 }

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerViewHolder {
 val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_outside, parent, false)
 return PagerViewHolder(itemView)
 }

 override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {
 holder.bindData()
 }

 override fun getItemCount(): Int = 2

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity">

 <androidx.viewpager2.widget.ViewPager2
 android:id="@+id/viewpager2outside"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:overScrollMode="never"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintRight_toRightOf="parent"
 app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

item_outside.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <androidx.viewpager2.widget.ViewPager2
 android:id="@+id/viewpager2inner"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:overScrollMode="never"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintRight_toRightOf="parent"
 app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

item_page.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center">

 <TextView
 android:id="@+id/tv_text"
 android:background="#0000ff"
 android:gravity="center"
 android:layout_centerHorizontal="true"
 android:layout_width="match_parent"
 android:layout_height="280dp"
 android:textColor="#ffffff"
 android:textSize="82sp" />
</RelativeLayout>

效果如下:

如果解决了滑动冲突应该在TextView对应的区域滑动时应该能从0滑动到1,而导致图中效果的原因是因为外层的ViewPager2拦截了横向的滑动事件,因为ViewPager2是final不能继承,所以我们给它套一层父ViewGroup来解决滑动冲突问题,这里我是在外面的ViewPager2里面放了俩个ViewPager2 我想做到的是从第一个里面的Vp2(ViewPager2)0划到1再到2到3再到里面的第二个Vp2的0再到1再到2再到3,而不是直接从第一个里面的Vp2(ViewPager2)0滑倒里面的第二个Vp2的0。

下面上源码,只上有改动的代码,像MainActivity及activity_main.xml等没有改动就不再上了

ViewPager2Container

package com.example.banner

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.RelativeLayout
import androidx.viewpager2.widget.ViewPager2

class ViewPager2Container @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : RelativeLayout(context, attrs, defStyleAttr) {
 private lateinit var mViewPager2: ViewPager2

 override fun onFinishInflate() {
 super.onFinishInflate()
 for (i in 0 until childCount) {
  val childView = getChildAt(i)
  if (childView is ViewPager2) {
  mViewPager2 = childView
  break
  }
 }
 }

 override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
 when (ev.action) {
  //不能让父View拦截事件否则父View会拦截接下来的一系列事件
  MotionEvent.ACTION_DOWN -> {
  parent.requestDisallowInterceptTouchEvent(true)
  }
  MotionEvent.ACTION_MOVE -> {
  if(mViewPager2.currentItem!=mViewPager2.adapter!!.itemCount-1){
   parent.requestDisallowInterceptTouchEvent(true)
  }else{
   parent.requestDisallowInterceptTouchEvent(false)
  }
  }
 }
 return super.onInterceptTouchEvent(ev)
 }
}

item_outside.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <com.example.banner.ViewPager2Container
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 app:layout_constraintTop_toTopOf="parent">

 <androidx.viewpager2.widget.ViewPager2
  android:id="@+id/viewpager2inner"
  android:layout_width="match_parent"
  android:layout_height="280dp"
  android:overScrollMode="never" />
 </com.example.banner.ViewPager2Container>


</androidx.constraintlayout.widget.ConstraintLayout>

当然我这样写还是有些东西没有考虑到的,我这里的解决方案仅提供一种解决思路,不去考虑很完善的解决方案

对于我上面写的代码,在滑到里面的第二个vp2的3时再向左滑动时会直接滑到里面的第一个vp2,具体怎么解决很简单

我这里的解决方案仅提供一种解决思路,主要是巩固怎么解决滑动冲突方面的知识!

最后上效果图


  • 本文相关:
  • android listview物流获取追踪功能实现
  • android中在activity中响应listview内部按钮的点击事件的两种方法
  • android studio 下 flutter 开发环境搭建过程
  • flutter底部不规则导航的实现过程
  • android cts测试方法及步骤详解
  • java实现andriod带看括弧的计算器代码
  • android非xml形式动态生成、调用页面的方法
  • android使用webwiew载入页面使用示例(hybrid app开发)
  • android登录的简单处理
  • android中的appwidget入门教程
  • viewpager的滑动与点击发生冲突怎么解决
  • Android 使用ViewPager报下面这个错 滑动2次程序就...
  • 怎么解决 ListView+ViewPager滑动事件冲突
  • Android 中 DrawerLayout + ViewPager 怎么解决滑...
  • android viewpager滑动与slidingpanelayout冲突怎...
  • Android中图片长按事件与viewpager滑动的冲突
  • viewpager嵌入webview后,当左右滑动时出现冲突,...
  • 安卓开发ViewPager与下拉刷新手势冲突问题???
  • 如何解决 Android WebView 里放大与手势滑动的冲突...
  • android scrollview 嵌套 viewpager 嵌套 gridview...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言r语言其它相关首页viewpager2滑动冲突解决方案解决viewpager和slidingpanelayout的滑动事件冲突问题viewpager和slidingpanelayout的滑动事件冲突解决方法android解决viewpager嵌套滑动冲突并保留侧滑菜单功能android中drawerlayout+viewpager滑动冲突的解决方法android 中swiperefreshlayout与viewpager滑动事件冲突解决方法android app中viewpager所带来的滑动冲突问题解决方法android listview物流获取追踪功能实现android中在activity中响应listview内部按钮的点击事件的两种方法android studio 下 flutter 开发环境搭建过程flutter底部不规则导航的实现过程android cts测试方法及步骤详解java实现andriod带看括弧的计算器代码android非xml形式动态生成、调用页面的方法android使用webwiew载入页面使用示例(hybrid app开发)android登录的简单处理android中的appwidget入门教程一看就懂的android app开发入门教微信公众平台开发入门教程(图文详android基础之使用fragment控制切六款值得推荐的android(安卓)开android textview设置中文字体加android应用开发sharedpreferencandroid 动画之translateanimatiandroid压力测试命令monkey详解android按钮单击事件的四种常用写android调试工具ddms的使用详解android 图片存入系统相册更新显示实例详android旋转、平移、缩放和透明度渐变的补android中vim编辑器进阶的使用介绍android 录音与播放功能的简单实例android:控件gridview的使用实例android布局控件之常用linearlayout布局android中textview实现分段显示不同颜色的android中使用protobuf的具体示例代码分析android实现侧滑菜单android利用chronometer实现倒计时功能
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved