在屏幕上显示特定百分比时,在回收站视图中暂停video

我想在播放器视图适配器的屏幕上查看video的75%时播放video。 所以findFirstVisibleItem和所有这些不会在这里工作。 (或者如果他们这样做,我不知道他们将如何工作)。

目前,我正在等待意见被回收,然后才能暂停或播放video,但是这种情况在新视图生成的那一刻开始。 任何人都可以请帮忙,我一直在研究这个很长时间,并没有得到任何地方。

你所要做的就是使用一个**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); } } 

使用RecyclerView.ItemDecoration。

ItemDecoration在渲染回收者的内容时被多次调用,因此它不应该在这里执行繁重的工作,但是可以使用它来通知何时可以看到某个百分比的视图。

ItemDecoration有几个方法,但是你需要实现的方法是:

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

或者可能

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

对于你要求你的情况,你会注意到没有什么区别,但为了补充说明,当你的行在屏幕上被渲染时,第一个被调用,所以你可以画“覆盖”它,第二个在该行被渲染之前被调用所以你可以在“下面”画一些东西。

对于这种情况,你不需要画任何东西,只是为了计算你的视图的大小。 为了这个任务,你需要得到渲染视图,并检测哪一个是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% // } // } } } 

您首先需要将ItemDecoration注册到recyclerView。

 recyclerView.addItemDecoration(theItemDecoration); 

将此代码添加到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 } }} 

我认为你应该尝试这个,它为我工作;

https://github.com/eneim/Toro

在这里输入图像说明