简体   繁体   English

PagerAdapter 在 ViewPager 中总是被调用两次

[英]PagerAdapter always getting called two times in ViewPager

I am trying to make a slider between TouchImageView and PlayerView ( Exoplayer ) but I am unable to catch up with certain issues that are persisting even after several changes.我试图在TouchImageViewPlayerView ( Exoplayer ) 之间制作一个滑块,但我无法赶上即使经过多次更改仍然存在的某些问题。 All the suggestions and answers are welcome.欢迎所有的建议和答案。 Pardon my questioning skills and please let me know if more inputs are needed for your analysis.请原谅我的提问技巧,如果您的分析需要更多输入,请告诉我。 Kindly also let me know if there is any other alternative to successfully meet my expectations of properly implementing views smoothly in ViewPager .还请告诉我是否还有其他替代方法可以成功满足我在ViewPager顺利正确实现视图的ViewPager

Problem description:-问题描述:-

Issues related to click on view :-与点击查看相关的问题:-

  1. When the image is clicked, the audio of next video (if any) starts playing in background.单击图像时,下一个视频(如果有)的音频开始在后台播放。
  2. The same issue is with PlayerView . PlayerView也有同样的问题。 When the video thumbnail is clicked, the audio of clicked video as well as next video plays together.当点击视频缩略图时,点击视频的音频和下一个视频一起播放。

Issues related to slider :-与滑块相关的问题:-

  1. When an we slide and reach to an image preceding to a video, the audio starts playing in background.当我们滑动并到达视频之前的图像时,音频开始在后台播放。 However, after sliding once toward video and sliding again in forward or backward direction from video for once, the audio stops.但是,在向视频滑动一次并再次从视频向前或向后滑动一次后,音频停止。 But this issue persists after viewing more than one images in forward or backward direction of video.但是在视频的向前或向后方向查看多个图像后,此问题仍然存在。

Attempts made by me to solve this issue :-我为解决此问题所做的尝试:-

  1. I tried to use playerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {...}) method in PagerAdapter to handle player states while sliding between views.我试图用playerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {...})在方法PagerAdapter处理球员状态,而视图之间滑动。 Unfortunately, I was unable to grasp to use different player states.不幸的是,我无法掌握使用不同的播放器状态。
  2. I also tried to use viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {...} method in StatusViewer class.我还尝试在StatusViewer类中使用viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {...}方法。

StatusViewer Java class (Setting PagerAdapter class object in ViewPager ) :- 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 ) (code mentioned below is inside instantiateItem ):- 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);
}

Thank you StackOverflow community for viewing this question.感谢 StackOverflow 社区查看此问题。 I resolved the above issue by below mentioned modifications :-我通过以下提到的修改解决了上述问题:-

  1. Changes in ImageSliderAdapter ( PagerAdapter ) :- ImageSliderAdapter ( PagerAdapter ) 的变化:-

-> Below mentioned code was added in onViewAttachedToWindow(View v) :- -> 在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();
     }
}

-> Below mentioned code was added in onViewDetachedFromWindow(View v) :- -> 下面提到的代码被添加到onViewDetachedFromWindow(View v) :-

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

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

  1. Changes in StatusViewer Java class :- StatusViewer Java 类的变化:-

-> The below changes cured the issue of player malfunctioning and player's play state and release state. -> 以下更改解决了播放器故障和播放器play状态和release状态的问题。 I used the smoothScroll: false in setCurrentItem .我在setCurrentItem使用了smoothScroll: false

    viewPager.setCurrentItem(position,false);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM