Как предотвратить нажатие при прокрутке в ViewPager2? - PullRequest
1 голос
/ 04 июня 2019

Как я могу предотвратить вызов "onClick" при прокрутке в ViewPager2 ?
Обратите внимание, что я спрашиваю о ViewPager2.
Когда я прокручиваю видовой пейджер, элемент щелкается.

activity_main.xml

<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="match_parent"/>

</RelativeLayout>

PageViewAdapter

class PageViewAdapter(
    private val context: Context,
    private val list: ArrayList<Video>,
    private val lifecycle: Lifecycle
) :
    RecyclerView.Adapter<PageViewAdapter.MyViewHolder>() {

           override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view =
            LayoutInflater.from(context).inflate(R.layout.fragment_video, parent, false)
        return MyViewHolder(view).apply {
            playerView.setOnClickListener {
                playOrResume()
            }
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val mediaSource = buildMediaSource(list[position].uri)
        holder.player.prepare(mediaSource)

    }

    override fun getItemCount(): Int {
        return list.size
    }

    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val playerView: PlayerView = itemView.player_view
        val player: SimpleExoPlayer = ExoPlayerFactory.newSimpleInstance(
            context,
            DefaultRenderersFactory(context),
            DefaultTrackSelector(),
            DefaultLoadControl()
        )    
        fun playOrResume() {
            player.playWhenReady = !player.playWhenReady
        }


    }
}

Здесь вы можете посмотреть видео действий: https://vimeo.com/340232497

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Я думаю, вы захотите попробовать методы в ViewPager2.OnPageChangeCallback .

val pageChangeCallback = object : ViewPager2.OnPageChangeCallback() {

  override fun onPageSelected(position: Int) {
    // New page becomes selected.
  }

  override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
    // Current page is scrolled.
  }

  override fun onPageScrollStateChanged(state: Int) {
    when(state) {
      ViewPager2.SCROLL_STATE_DRAGGING -> {
        // User begins dragging or a fake drag is started.
      }

      ViewPager2.SCROLL_STATE_IDLE -> {
        // Pager is fully stopped/idle.
      }

      ViewPager2.SCROLL_STATE_SETTLING -> {
        // Pager is automatically settling to the current page.
      }
    }
  }
}

// Register the callback to the pager.
viewPager2.registerOnPageChangeCallback(pageChangeCallback)


// TODO viewPager2.unregisterOnPageChangeCallback(pageChangeCallback)
0 голосов
/ 04 июня 2019

Заставляет recyclerView реагировать на события щелчка, когда он не прокручивается:

if (recyclerView.scrollState == SCROLL_STATE_IDLE) {
    playOrResume()
}

Обновление

Возможно, что-то подобное будет работать:

private static int mScrollState;

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView,int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        scrollState = recyclerView.scrollState;
    }
    // or use this method for finer control
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        switch (newState) {
            case RecyclerView.SCROLL_STATE_IDLE:
               System.out.println("The RecyclerView is not scrolling");
               break;
            case RecyclerView.SCROLL_STATE_DRAGGING:
                System.out.println("Scrolling now");
                break;
            case RecyclerView.SCROLL_STATE_SETTLING:
                System.out.println("Scroll Settling");
                break;
     }

}

});

Используйте mScrollState внутри ClickListener для проверки состояния

Обновление

Так что onCLick вызывается перед onScrollStateChanged, используйтеэто Handler в onCLick и остановится на 200, что позволит onScrollStateChanged активировать

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    if (recyclerView.scrollState == SCROLL_STATE_IDLE) {
        playOrResume()
    }
  }
}, 200);
...