簡體   English   中英

PagerAdapter 在 ViewPager 中總是被調用兩次

[英]PagerAdapter always getting called two times in ViewPager

我試圖在TouchImageViewPlayerView ( Exoplayer ) 之間制作一個滑塊,但我無法趕上即使經過多次更改仍然存在的某些問題。 歡迎所有的建議和答案。 請原諒我的提問技巧,如果您的分析需要更多輸入,請告訴我。 還請告訴我是否還有其他替代方法可以成功滿足我在ViewPager順利正確實現視圖的ViewPager

問題描述:-

與點擊查看相關的問題:-

  1. 單擊圖像時,下一個視頻(如果有)的音頻開始在后台播放。
  2. PlayerView也有同樣的問題。 當點擊視頻縮略圖時,點擊視頻的音頻和下一個視頻一起播放。

與滑塊相關的問題:-

  1. 當我們滑動並到達視頻之前的圖像時,音頻開始在后台播放。 但是,在向視頻滑動一次並再次從視頻向前或向后滑動一次后,音頻停止。 但是在視頻的向前或向后方向查看多個圖像后,此問題仍然存在。

我為解決此問題所做的嘗試:-

  1. 我試圖用playerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {...})在方法PagerAdapter處理球員狀態,而視圖之間滑動。 不幸的是,我無法掌握使用不同的播放器狀態。
  2. 我還嘗試在StatusViewer類中使用viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {...}方法。

StatusViewer Java 類(在ViewPager設置PagerAdapter類對象):-

modelFeedArrayList = (ArrayList<File>) getIntent().getSerializableExtra("modelFeedArrayList");
position = intent.getIntExtra("position", 0);
ImageSlideAdapter imageSlideAdapter = new ImageSlideAdapter(this,modelFeedArrayList,position);
viewPager.setAdapter(imageSlideAdapter);
viewPager.setCurrentItem(position);
viewPager.setOffscreenPageLimit(0);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

            File currentFile = modelFeedArrayList.get(position);
            String filePath = currentFile.toString();
            if (filePath.endsWith(".jpg") || currentPage == position){
                currentPage = position;
                ImageSlideAdapter.player.pause();
            }
            else {
                currentPage = position;
                ImageSlideAdapter.player.play();
            }

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

ImageSliderAdapter ( PagerAdapter ) (下面提到的代碼在instantiateItem里面):-

File currentFile = modelFeedArrayList.get(position);
String filePath = currentFile.toString();

if (currentFile.getAbsolutePath().endsWith(".mp4")) {
    statusImageView.setVisibility(View.GONE);
    playerView.setVisibility(View.VISIBLE);

    player = new ExoPlayer.Builder(context).build();

    MediaItem mediaItem = MediaItem.fromUri(filePath);
    player.addMediaItem(mediaItem);

    playerView.setPlayer(player);
    player.prepare();
    playerView.setBackgroundColor(context.getResources().getColor(android.R.color.black));

        playerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
            @Override
            public void onViewAttachedToWindow(View v) {

                Log.d("Filepath", filePath);
                Log.d("Position", "" + position);
            }

            @Override
            public void onViewDetachedFromWindow(View v) {

                if (filePath.endsWith(".jpg") || currentPage == position || modelFeedArrayList.get(currentPage).getAbsolutePath().endsWith(".jpg")){
                    currentPage = position;
                    player.pause();
                    Objects.requireNonNull(playerView.getPlayer()).pause();
                }
                else {
                    player.release();
                    Objects.requireNonNull(playerView.getPlayer()).release();
                }
            }
        });


    } else {
        playerView.setVisibility(View.GONE);
        statusImageView.setVisibility(View.VISIBLE);
        Glide.with(context).load(modelFeedArrayList.get(position)).into(statusImageView);

        statusImageView.setBackgroundColor(context.getResources().getColor(android.R.color.black));
    }

    Objects.requireNonNull(container).addView(itemView);

    return itemView;
}

@Override
public void destroyItem(@NonNull @NotNull ViewGroup container, int position, @NonNull @NotNull Object object) {

    container.removeView((ConstraintLayout) object);
}

感謝 StackOverflow 社區查看此問題。 我通過以下提到的修改解決了上述問題:-

  1. ImageSliderAdapter ( PagerAdapter ) 的變化:-

-> 在onViewAttachedToWindow(View v)添加了onViewAttachedToWindow(View v)代碼:-

if (filePath.endsWith(".jpg") || currentPage == position || modelFeedArrayList.get(currentPage).getAbsolutePath().endsWith(".jpg")){
     currentPage = position;
     player.pause();
     Objects.requireNonNull(playerView.getPlayer()).pause();
}
else {
     player.pause();
     Objects.requireNonNull(playerView.getPlayer()).pause();
     if (filePath.endsWith(".mp4")){
          player.pause();
          Objects.requireNonNull(playerView.getPlayer()).pause();
     }
     else {
          player.play();
          Objects.requireNonNull(playerView.getPlayer()).play();
     }
}

-> 下面提到的代碼被添加到onViewDetachedFromWindow(View v) :-

if (filePath.endsWith(".mp4")){
     player.release();
     Objects.requireNonNull(playerView.getPlayer()).release();
}

-> player.play()是在player.prepare()之后添加的。

  1. StatusViewer Java 類的變化:-

-> 以下更改解決了播放器故障和播放器play狀態和release狀態的問題。 我在setCurrentItem使用了smoothScroll: false

    viewPager.setCurrentItem(position,false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM