PagerAdapter 总是在 ViewPager 中被调用两次
PagerAdapter always getting called two times in ViewPager
我正在尝试在 TouchImageView
和 PlayerView
(Exoplayer
) 之间创建一个滑块,但我无法解决某些即使经过多次更改后仍然存在的问题。欢迎所有的建议和答案。请原谅我的提问技巧,如果您的分析需要更多输入,请告诉我。也请让我知道是否有任何其他选择可以成功满足我在 ViewPager
.
中顺利正确实施视图的期望
问题描述:-
与点击视图相关的问题:-
- 单击图片时,下一个视频(如果有)的音频开始在后台播放。
PlayerView
也有同样的问题。单击视频缩略图时,单击视频的音频将与下一个视频一起播放。
与滑块相关的问题:-
- 当我们滑动并到达视频前面的图像时,音频开始在后台播放。但是,向视频滑动一次并再次从视频向前或向后滑动一次后,音频停止。但是在视频的正向或反向观看多于一张图像后,这个问题仍然存在。
我为解决这个问题所做的尝试:-
- 我尝试使用
PagerAdapter
中的 playerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {...})
方法在视图之间滑动时处理播放器状态。不幸的是,我无法掌握使用不同的播放器状态。
- 我也试过在
StatusViewer
class中使用viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {...}
方法。
StatusViewer
Java class(在ViewPager
中设置PagerAdapter
class对象):-
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);
}
感谢 Whosebug 社区查看此问题。我通过下面提到的修改解决了上述问题:-
- ImageSliderAdapter 的变化(
PagerAdapter
):-
-> 在 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()
之后添加的。
StatusViewer
Javaclass中的变化:-
-> 以下更改解决了播放器故障和播放器 play
状态和 release
状态的问题。我在 setCurrentItem
.
中使用了 smoothScroll: false
viewPager.setCurrentItem(position,false);
我正在尝试在 TouchImageView
和 PlayerView
(Exoplayer
) 之间创建一个滑块,但我无法解决某些即使经过多次更改后仍然存在的问题。欢迎所有的建议和答案。请原谅我的提问技巧,如果您的分析需要更多输入,请告诉我。也请让我知道是否有任何其他选择可以成功满足我在 ViewPager
.
问题描述:-
与点击视图相关的问题:-
- 单击图片时,下一个视频(如果有)的音频开始在后台播放。
PlayerView
也有同样的问题。单击视频缩略图时,单击视频的音频将与下一个视频一起播放。
与滑块相关的问题:-
- 当我们滑动并到达视频前面的图像时,音频开始在后台播放。但是,向视频滑动一次并再次从视频向前或向后滑动一次后,音频停止。但是在视频的正向或反向观看多于一张图像后,这个问题仍然存在。
我为解决这个问题所做的尝试:-
- 我尝试使用
PagerAdapter
中的playerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {...})
方法在视图之间滑动时处理播放器状态。不幸的是,我无法掌握使用不同的播放器状态。 - 我也试过在
StatusViewer
class中使用viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {...}
方法。
StatusViewer
Java class(在ViewPager
中设置PagerAdapter
class对象):-
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);
}
感谢 Whosebug 社区查看此问题。我通过下面提到的修改解决了上述问题:-
- ImageSliderAdapter 的变化(
PagerAdapter
):-
-> 在 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()
之后添加的。
StatusViewer
Javaclass中的变化:-
-> 以下更改解决了播放器故障和播放器 play
状态和 release
状态的问题。我在 setCurrentItem
.
smoothScroll: false
viewPager.setCurrentItem(position,false);