У меня есть видео-канал (похожий на TikTok), но когда я провожу пальцем вверх, воспроизводится новое видео, но старое продолжает проигрываться. Мне удалось получить прослушиватель страниц, но я не могу управлять ExoPlayer из «Домашнего фрагмента».
Есть идеи, как вызвать что-то внутри адаптера RecyclerView из домашнего фрагмента?
Если есть лучшее решение для этого, пожалуйста, скажите мне.
Спасибо.
Домашний фрагмент
public class HomeFragment extends Fragment {
private View view;
RecyclerView recyclerView;
List<Model> models = new ArrayList<>();
MainRecylerAdapter adapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_home, container, false);
recyclerView = view.findViewById(R.id.recyclerview);
models.add(new Model(1, "https://www.newslistener.com/Mukesh/1.mp4", "one"));
models.add(new Model(2, "https://www.newslistener.com/Mukesh/2.mp4", "one"));
models.add(new Model(3, "https://www.newslistener.com/Mukesh/3.mp4", "one"));
models.add(new Model(4, "https://www.newslistener.com/Mukesh/4.mp4", "one"));
models.add(new Model(5, "https://www.newslistener.com/Mukesh/5.mp4", "one"));
models.add(new Model(6, "https://www.newslistener.com/Mukesh/6.mp4", "one"));
models.add(new Model(7, "https://www.newslistener.com/Mukesh/7.mp4", "one"));
models.add(new Model(8, "https://www.newslistener.com/Mukesh/8.mp4", "one"));
models.add(new Model(9, "https://www.newslistener.com/Mukesh/9.mp4", "one"));
models.add(new Model(10, "https://www.newslistener.com/Mukesh/10.mp4", "one"));
models.add(new Model(11, "https://www.newslistener.com/Mukesh/11.mp4", "one"));
models.add(new Model(12, "https://www.newslistener.com/Mukesh/12.mp4", "one"));
models.add(new Model(13, "https://www.newslistener.com/Mukesh/13.mp4", "one"));
models.add(new Model(14, "https://www.newslistener.com/Mukesh/14.mp4", "one"));
models.add(new Model(15, "https://www.newslistener.com/Mukesh/15.mp4", "one"));
models.add(new Model(16, "https://www.newslistener.com/Mukesh/16.mp4", "one"));
models.add(new Model(17, "https://www.newslistener.com/Mukesh/17.mp4", "one"));
models.add(new Model(18, "https://www.newslistener.com/Mukesh/18.mp4", "one"));
models.add(new Model(19, "https://www.newslistener.com/Mukesh/19.mp4", "one"));
models.add(new Model(20, "https://www.newslistener.com/Mukesh/20.mp4", "one"));
models.add(new Model(21, "https://www.newslistener.com/Mukesh/21.mp4", "one"));
models.add(new Model(22, "https://www.newslistener.com/Mukesh/22.mp4", "one"));
models.add(new Model(23, "https://www.newslistener.com/Mukesh/23.mp4", "one"));
models.add(new Model(24, "https://www.newslistener.com/Mukesh/24.mp4", "one"));
models.add(new Model(25, "https://www.newslistener.com/Mukesh/25.mp4", "one"));
models.add(new Model(26, "https://www.newslistener.com/Mukesh/26.mp4", "one"));
models.add(new Model(27, "https://www.newslistener.com/Mukesh/27.mp4", "one"));
models.add(new Model(28, "https://www.newslistener.com/Mukesh/28.mp4", "one"));
models.add(new Model(29, "https://www.newslistener.com/Mukesh/29.mp4", "one"));
models.add(new Model(30, "https://www.newslistener.com/Mukesh/30.mp4", "one"));
models.add(new Model(31, "https://www.newslistener.com/Mukesh/31.mp4", "one"));
models.add(new Model(32, "https://www.newslistener.com/Mukesh/32.mp4", "one"));
models.add(new Model(33, "https://www.newslistener.com/Mukesh/33.mp4", "one"));
models.add(new Model(34, "https://www.newslistener.com/Mukesh/34.mp4", "one"));
models.add(new Model(35, "https://www.newslistener.com/Mukesh/35.mp4", "one"));
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
adapter = new MainRecylerAdapter(models, getActivity());
recyclerView.setAdapter(adapter);
return view;
}
}
Адаптер
public class MainRecylerAdapter extends RecyclerView.Adapter<MainRecylerAdapter.ViewHolder> {
List<Model> models = new ArrayList<>();
Context context;
private int index = 0;
public MainRecylerAdapter(List<Model> models, Context context) {
this.models = models;
this.context = context;
}
@NonNull
@Override
public MainRecylerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_recyler_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MainRecylerAdapter.ViewHolder holder, final int position) {
if (holder.isPlaying()) {
Log.e("TAG1", "play");
holder.releasePlayer();
holder.intiPlayer(models.get(position).getUrl());
} else {
Log.e("TAG1", "empty");
holder.intiPlayer(models.get(position).getUrl());
}
}
@Override
public int getItemCount() {
return models.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
SimpleExoPlayerView exoPlayerView;
SimpleExoPlayer exoPlayer;
private long playbackPosition;
private int currentWindow;
private boolean playWhenReady;
ProgressBar progressBar;
public ViewHolder(@NonNull View itemView) {
super(itemView);
exoPlayerView = itemView.findViewById(R.id.exoplayerview);
progressBar = itemView.findViewById(R.id.progress);
}
private void intiPlayer(String url) {
try {
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelector);
Uri videoURI = Uri.parse(url);
DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("exoplayer_video");
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
MediaSource mediaSource = new ExtractorMediaSource(videoURI, dataSourceFactory, extractorsFactory, null, null);
exoPlayerView.setPlayer(exoPlayer);
exoPlayer.prepare(mediaSource);
exoPlayer.setPlayWhenReady(true);
} catch (Exception e) {
Log.e("MainAcvtivity", " exoplayer error " + e.toString());
}
}
private boolean isPlaying() {
return exoPlayer != null
&& exoPlayer.getPlaybackState() != Player.STATE_ENDED
&& exoPlayer.getPlaybackState() != Player.STATE_IDLE
&& exoPlayer.getPlayWhenReady();
}
private void releasePlayer() {
if (exoPlayer != null) {
playbackPosition = exoPlayer.getCurrentPosition();
currentWindow = exoPlayer.getCurrentWindowIndex();
playWhenReady = exoPlayer.getPlayWhenReady();
exoPlayer.release();
exoPlayer = null;
}
}
}