Android RecyclerView中的ViewPager:ViewPager截取父视图';s咔嗒声

Android RecyclerView中的ViewPager:ViewPager截取父视图';s咔嗒声,android,android-recyclerview,android-viewpager,android-viewpager2,Android,Android Recyclerview,Android Viewpager,Android Viewpager2,我有一个包含CardView的Recyclerview。CardView包含一个ViewPager2和一些其他视图(文本等)。我想捕捉用户在CardView(父级)上单击任意位置的时间,并运行一些逻辑。问题:即使ViewPager是CardView的子项,它仍然会干扰CardView的onClickListener,如果用户单击绘制ViewPager的CardView部分,则永远不会触发CardView的listener 从根本上说,这很有趣,因为我希望父视图取代子视图中的任何单击侦听器,但Vi

我有一个包含CardView的Recyclerview。CardView包含一个ViewPager2和一些其他视图(文本等)。我想捕捉用户在CardView(父级)上单击任意位置的时间,并运行一些逻辑。问题:即使ViewPager是CardView的子项,它仍然会干扰CardView的onClickListener,如果用户单击绘制ViewPager的CardView部分,则永远不会触发CardView的listener

从根本上说,这很有趣,因为我希望父视图取代子视图中的任何单击侦听器,但ViewPager在这方面似乎是一种独特的布局

我已经研究过解决方案,但我不确定其中是否有最佳实践,因为在我的案例中,onClick逻辑驻留在一个RecyclerView中。因为我在ViewHolder的init方法中实例化侦听器,所以应该避免不必要的对象实例化,但我要谨慎,不要做出效率低下的解决方案

我的解决方案的要求是:

  • 如果用户单击我的CardView上的任意位置,请运行我的onClickListener(它将启动一个片段)
  • 如果用户在my CardView中滑动ViewPager,请让ViewPager像往常一样处理事件,而不要运行CardView的onClick逻辑
  • 正确的方法是什么?在我下面的代码中,ViewPager外部的单击是有效的,但ViewPager顶部的单击不会触发片段启动逻辑

    观众

    class RaffleViewHolder(cardView: CardView) : RecyclerView.ViewHolder(cardView), View.OnClickListener {
            val itemName = cardView.itemName
            val viewPager = cardView.viewPager
            val featuredWedge = cardView.quarter_circle
            val imageViewPagerAdapter = RaffleItemViewPagerAdapter()
    
            init {
                viewPager.adapter = imageViewPagerAdapter
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    viewPager.setPageTransformer(ViewPagerDepthPageTransformer())
                }
                cardView.setOnClickListener(this)
            }
    
            override fun onClick(view: View?) {
                Timber.d("onclick fired in recyclerviewadapter")
                //do stuff. This is only reached for clicks outside of the ViewPager
            }
        }
    
    用于CardView的XML

    <androidx.cardview.widget.CardView
        android:id="@+id/itemCard"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"
        android:elevation="2dp"
        app:cardBackgroundColor="@color/white">
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <androidx.viewpager2.widget.ViewPager2
                android:id="@+id/viewPager"
                android:layout_width="300dp"
                android:layout_height="300dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/itemName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/viewPager" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.cardview.widget.CardView>