ViewPager2滑动冲突的解决方法
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,具体怎么解决很简单
我这里的解决方案仅提供一种解决思路,主要是巩固怎么解决滑动冲突方面的知识!
最后上效果图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: eos 源码资源限制两个对象
下一篇: 原生js封装无缝轮播功能
推荐阅读
-
Android ListView与ScrollView冲突的解决方法总结
-
Android之ScrollView嵌套ListView和GridView冲突的解决方法
-
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
-
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
-
模板视图和AngularJS之间冲突的解决方法
-
asp.net开发与web标准的冲突问题的一些常见解决方法
-
html文件中jquery与velocity变量中的$冲突的解决方法
-
Android中DrawerLayout+ViewPager滑动冲突的解决方法
-
python3.8与pyinstaller冲突问题的快速解决方法
-
android基础教程之android的listview与edittext冲突解决方法