Pausar un video en un recicladorVer cuando hay un cierto porcentaje en la pantalla

Quiero reproducir un video cuando su vista es del 75% en la pantalla dentro del adaptador recyclerView. Así que findFirstVisibleItem y todos los que no funcionan aquí. (O si lo hacen, no tengo ni idea de cómo funcionaría).

Actualmente estoy esperando a que se reciclen las vistas antes de poder pausar o reproducir un video, pero esto comienza en el momento en que se genera una nueva vista. ¿Puede alguien por favor ayuda que he estado investigando esto por mucho tiempo y no han llegado a ningún lugar.

Todo lo que tienes que hacer es usar una **Model Class** .!

  Class Video{ String videoUrl; //Http:// int videoDrawable; //R.id.video String videoName=; boolean isplaying=flase; boolean ispuase=false; int lastDuration=0; //Constructors gettter and setter here.! } /////////////////// Class AdapterClasss{ int lastpostion=-1; VideoView videoView ; public MyViewHolder(View view) { super(view); videoView =(VideoView)view.findViewById(R.id.videoView1); playBtn=(Button)view.findViewById(R.id.playBtn); pauseBtn=(Button)view.findViewById(R.id.pauseBtn); } 

Ahora en su Adapter Class hacer pocos cambios en onBindViewHolder

  @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { final Video videoObj= videoList.get(position); /Creating MediaController holder.playBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MediaController mediaController= new MediaController(this); mediaController.setAnchorView(holder.videoView); //specify the location of media file Uri uri=Uri.parse(Environment.getExternalStorageDirectory().getPath()+ "/media/"+videoObj.getvideoName()+".mp4"); //Setting MediaController and URI, then starting the videoView videoView.setMediaController(mediaController); videoView.setVideoURI(uri); videoView.requestFocus(); lastpostion=position; if(videoObj.getisPuase()) { //now here you have to set your duration fro where you want to start your video if(videoView.ispause()) { videoView.start(); videoObj.setisPlaying(true); notifyItemChanged(position); } }else if(videoObj.getisPlaying()!=true) { videoView.start(); videoObj.setisPlaying(true); notifyItemChanged(position); } } holder.pauseBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int duration = videoView.getDuration(); videoView.pause(); lastDuration.setLastDuration(duration); videoObj.setisPlaying(false); videoObj.setisPlaying(true); } } 

Utilice un RecyclerView.ItemDecoration.

ItemDecoration se denomina tiempo múltiple mientras procesa el contenido del reciclador para que no se suponga que haga cosas pesadas aquí, pero puede utilizarlo para notificar cuando se vea algún porcentaje de la vista.

ItemDecoration tiene varios métodos, pero el que necesita implementar es:

 public void onDrawOver(Canvas c, RecyclerView parent, State state); 

o tal vez

 public void onDraw(Canvas c, RecyclerView parent, State state); 

Para el caso que usted está pidiendo no notará ninguna diferencia, pero para complementar la explicación el primero se llama cuando su fila se representa en la pantalla para que pueda pintar "sobre" y el segundo se llama antes de la fila se representa Así que usted puede pintar algo "debajo".

Para este caso no es necesario pintar nada, sólo para calcular el tamaño de su vista. Para esa misión necesita obtener las vistas de renderizado y detectar cuál es la que tiene el video.

 @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); int adapterPos = parent.getChildAdapterPosition(child); int viewType = parent.getAdapter().getItemViewType(adapterPos); ... Your code here ... // if(viewType == THE_EXPECTED_TYPE) { // if(child.top() == parent.top()) { // notifyViewIsVisibleAt100(); //100%; make your calcs to ensure your 75% // } // } } } 

Debe registrar la ItemDecoration en el recicladorVer primero.

 recyclerView.addItemDecoration(theItemDecoration); 

Agregue este código en su visualizador de desplazamiento de vista de reciclado en ScrollStatechanged:

 if (newState == RecyclerView.SCROLL_STATE_IDLE) { LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager()); int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); int findFirstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition(); Video video; if (urls != null && urls.size() > 0) { if (findFirstCompletelyVisibleItemPosition >= 0) { //handle here to play video in adapter } else { //code here for another position } }} 

Creo que deberías probar esto, funcionó para mí;

https://github.com/eneim/Toro

Introduzca aquí la descripción de la imagen

  • Centrar verticalmente el elemento seleccionado en RecyclerView
  • Elemento de centrado de Android en RecyclerView
  • Android RecyclerView adición y eliminación de artículos
  • Desactivar desplazamiento para posición en RecyclerView utilizando ItemTouchHelper.SimpleCallback
  • Inconsistencia detectada en RecyclerView, Cómo cambiar el contenido de RecyclerView mientras se desplaza
  • TableLayout con RecyclerView
  • RecyclerView: Las clases internas no pueden tener una declaración estática
  • Recyclerview no llama aCreateViewHolder
  • ¿Cómo implementar multi-select en RecyclerView?
  • RecyclerView gravedad
  • Transición de elemento compartido en RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.