Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当RecyclerView.SCROLL\u STATE\u拖动并在销毁时释放播放器时,如何暂停ExoPlayer playerView_Java_Android_Video_Android Recyclerview_Exoplayer2.x - Fatal编程技术网

Java 当RecyclerView.SCROLL\u STATE\u拖动并在销毁时释放播放器时,如何暂停ExoPlayer playerView

Java 当RecyclerView.SCROLL\u STATE\u拖动并在销毁时释放播放器时,如何暂停ExoPlayer playerView,java,android,video,android-recyclerview,exoplayer2.x,Java,Android,Video,Android Recyclerview,Exoplayer2.x,我想实现一个RecyclerView,它的工作原理类似于Instagram提要,包含图像和视频项目。我已成功实现recyclerView以同时显示图像和视频项目,但当onScrollListener打开时,我遇到了暂停视频项目的问题。recyclerView。滚动\u状态\u拖动我正在使用视频播放器的ExoPlayer库” 因此,如果播放一个视频且recyclerView未暂停,则即使列表中播放了另一个视频,它也会继续播放该视频。使多个视频同时播放 下面是我的实现适配器 public class

我想实现一个RecyclerView,它的工作原理类似于Instagram提要,包含图像和视频项目。我已成功实现recyclerView以同时显示图像和视频项目,但当onScrollListener打开时,我遇到了暂停视频项目的问题。
recyclerView。滚动\u状态\u拖动
我正在使用视频播放器的ExoPlayer库”

因此,如果播放一个视频且recyclerView未暂停,则即使列表中播放了另一个视频,它也会继续播放该视频。使多个视频同时播放

下面是我的实现适配器

public class RecyclerAdapter extends RecyclerView.Adapter {

    private ArrayList<ListModel> listModelList;
    private Context context;

    SimpleExoPlayer exoPlayer;

    public RecyclerAdapter(ArrayList<ListModel> listModelList, Context context) {
        this.listModelList = listModelList;
        this.context = context;
    }

    @Override
    public int getItemViewType(int position) {
        if (listModelList.get(position).getDescription().equalsIgnoreCase("video")) {
            return 1;
        } else {
            return 0;
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view;

        if (viewType == 0) {
            view = inflater.inflate(R.layout.recycler_item, parent, false);
            return new AdsViewHolder(view);
        } else {
            view = inflater.inflate(R.layout.video_item, parent, false);
            return new VideoVH(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
        ListModel listModel = listModelList.get(position);

        if (listModel.getDescription().equalsIgnoreCase("video")) {
            VideoVH videoVH = (VideoVH) holder;
            initPlayer(((VideoVH) holder).playerView, listModel.getMedia_url(), ((VideoVH) holder).progressBar);
            ((VideoVH) holder).titleText.setText(listModel.getTitle());
            ((VideoVH) holder).descText.setText(listModel.getDescription());

            //Play video
        } else {
            AdsViewHolder adsViewHolder = (AdsViewHolder) holder;

            ((AdsViewHolder) holder).titleText.setText(listModel.getTitle());
            ((AdsViewHolder) holder).descText.setText(listModel.getDescription());
            Glide.with(context)
                    .load(listModel.getMedia_url())
                    .into(((AdsViewHolder) holder).imageView);
        }
    }

    private void initPlayer(final PlayerView playerView, String uri, final ProgressBar progressBar) {


        TrackSelector trackSelector = new DefaultTrackSelector();

        exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelector);

        playerView.setPlayer(exoPlayer);
        exoPlayer.setPlayWhenReady(false);
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "ExoRecyclerView"));

        MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(uri));

        exoPlayer.prepare(videoSource);

        playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
        exoPlayer.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
        exoPlayer.seekTo(500);

        exoPlayer.addListener(new Player.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, @Nullable Object manifest, int reason) {

            }

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

            }

            @Override
            public void onLoadingChanged(boolean isLoading) {

            }

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

                switch (playbackState) {

                    case Player.STATE_BUFFERING:
//                        Log.e(TAG, "onPlayerStateChanged: Buffering video.");
                        if (progressBar != null) {
                            progressBar.setVisibility(VISIBLE);
                        }

                        break;
                    case Player.STATE_ENDED:
                        break;
                    case Player.STATE_IDLE:

                        break;
                    case Player.STATE_READY:
//                        Log.e(TAG, "onPlayerStateChanged: Ready to play.");
                        if (progressBar != null) {
                            progressBar.setVisibility(GONE);
                        }
                        break;
                    default:
                        break;
                }

            }

            @Override
            public void onRepeatModeChanged(int repeatMode) {

            }

            @Override
            public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }

            @Override
            public void onPositionDiscontinuity(int reason) {

            }

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

            }

            @Override
            public void onSeekProcessed() {

            }
        });
    }

    @Override
    public int getItemCount() {
        return listModelList.size();
    }

    class AdsViewHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView titleText, descText;

        public AdsViewHolder(@NonNull View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.thumbnail);
            descText = itemView.findViewById(R.id.desc);
            titleText = itemView.findViewById(R.id.title);
        }
    }

    class VideoVH extends RecyclerView.ViewHolder {


        PlayerView playerView;
        TextView titleText, descText;
        ConstraintLayout VV;
        ProgressBar progressBar;
        ImageView volumeControl;

        public VideoVH(@NonNull View itemView) {
            super(itemView);

            playerView = itemView.findViewById(R.id.playerView);
            descText = itemView.findViewById(R.id.desc);
            titleText = itemView.findViewById(R.id.title);
            volumeControl = itemView.findViewById(R.id.volume_control);
            VV = itemView.findViewById(R.id.parent);
            progressBar = itemView.findViewById(R.id.progressBar);
        }
    }

}
我在这里和youtube上讨论了几个问题,但它们都在recyclerView中实现了单一的视图类型


有什么建议我可以在recyclerView被滚动时控制视频播放器吗?或者有更好的方法我可以实现Instagram订阅源,比如recyclerView

@Askar我看过那篇文章,在那里建立了一个定制的recyclerView。他实现了同样的东西,但我自己的案例我有两种视图(图像和视频)如何创建一个同时容纳这两种视图的自定义视图?@steveOS您找到了解决方案吗?我也面临同样的问题,但找不到解决方案。@Adnanhaider没有,我还没有找到解决方案。我只是创建了一个方法来检查显示的项目,并暂停所有未显示在视图上的项目recyclerView@steveOS你能分享你的那份吗我还有一个节目要面对,那就是当我在recyclerview中停止我的应用程序时,它停止了最后一个视频,但在背景音频中还有其他内容,我不知道我能做些什么。@Askar我读了那篇文章,在那里建立了一个自定义的recyclerview。他实现了同样的事情,但我自己的案例我有两种视图(图像和视频)如何创建一个同时容纳这两种视图的自定义视图?@steveOS您找到了解决方案吗?我也面临同样的问题,但找不到解决方案。@Adnanhaider没有,我还没有找到解决方案。我只是创建了一个方法来检查显示的项目,并暂停所有未显示在视图上的项目recyclerView@steveOS你能分享你的那份吗我还有另外一个节目,当我在recyclerview中停止我的应用程序时,它停止了最后一个视频,但在背景音频中仍然有其他内容,我不知道我能做些什么。
public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    ArrayList<ListModel> listModelList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = findViewById(R.id.recyclerView);

        ListModel listModel = new ListModel();
        listModelList.add(new ListModel("One test",
                "https://res.cloudinary.com/dqrs5xew4/image/upload/v1591991924/sample.jpg", "image"));
        listModelList.add(new ListModel("One test",
                "https://res.cloudinary.com/dqrs5xew4/video/upload/v1595538345/HNG/b5bc3f170b7d5c388410bcca0a501ecd_lnhzwn.mp4", "video"));
        listModelList.add(new ListModel("One test",
                "https://res.cloudinary.com/dqrs5xew4/image/upload/v1591991924/sample.jpg", "image"));
        listModelList.add(new ListModel("One test",
                "https://res.cloudinary.com/dqrs5xew4/video/upload/v1595538331/HNG/VID-20180713-WA0009_esbmff.mp4", "video"));
        listModelList.add(new ListModel("One test",
                "https://res.cloudinary.com/dqrs5xew4/image/upload/v1591991924/sample.jpg", "image"));
        initRecyclerView();
    }

    private void initRecyclerView() {
        // use a linear layout manager
        LinearLayoutManager layoutManager =
                new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(layoutManager);

        RecyclerAdapter mAdapter = new RecyclerAdapter(listModelList, MainActivity.this);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
    }
}
public class ListModel {

    private String title;
    private String media_url;
    private String description;

    public ListModel(String title, String media_url, String description) {
        this.title = title;
        this.media_url = media_url;
        this.description = description;
    }

    public ListModel() {
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getMedia_url() {
        return media_url;
    }

    public void setMedia_url(String media_url) {
        this.media_url = media_url;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}