Приостановить видео в recyclerView, если на экране есть определенный процент

Я хочу воспроизвести видео, когда его вид составляет 75% на экране внутри адаптера recyclerView. Поэтому findFirstVisibleItem и все это не сработает. (Или, если они это сделают, я понятия не имею, как они будут работать).

В настоящее время я ожидаю, что просмотры будут переработаны до того, как я смогу приостановить или воспроизвести видео, но это начинается с момента создания нового представления. Может кто-нибудь, пожалуйста, помогите, я занимаюсь этим очень долго и не получил нигде.

Ответ 1

Все, что вам нужно сделать, это использовать **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);
    }

теперь в Adapter Class сделать несколько изменений в 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);


    }



    }

Ответ 2

Используйте утилиту RecyclerView.ItemDecoration.

ItemDecoration вызывается многократным временем рендеринга содержимого ресайклеров, поэтому здесь не предполагается делать тяжелый материал, но вы можете использовать его для уведомления, когда видится некоторый процент видимости.

ItemDecoration имеет несколько методов, но тот, который вам нужно реализовать:

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

или, возможно,

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

В случае, о котором вы просите, вы не заметите разницы, но в дополнение к объяснению, которое вызывается первым, когда ваша строка отображается на экране, чтобы вы могли нарисовать "над", а вторая вызывается перед строка отображается так, что вы можете нарисовать что-то "ниже".

В этом случае вам не нужно ничего рисовать, просто чтобы рассчитать размер вашего представления. Для этой миссии вам нужно получить представления рендеринга и определить, какой из них - видео.

@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%
   //      }
   //  }
    }
}

Вам необходимо сначала зарегистрировать ItemDecoration в recyclerView.

recyclerView.addItemDecoration(theItemDecoration);

Ответ 3

Добавьте этот код в свой прослушиватель прокрутки просмотра в 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
                    }
                }}

Ответ 4

Я думаю, вы должны попробовать это, это сработало для меня;

https://github.com/eneim/Toro

введите описание изображения здесь