在 GridView 中混合 ImageView 和 VideoView

Mix ImageView and VideoView in GridView

我有一些 url 可以是图片或视频。我只想将它们混合在一个 GridView (2*2) 中。因此,在构建适配器时,如何根据 url?

使用 ImageView 或 VideoView 实例化它

旧的实现只使用了一个只有图像和视频的 ImageView 的布局,并使用 clickListeners 启动另一个 activity 来播放视频。默认图像用作所有视频的占位符,这很难看。

如果 url 是图像,我只想显示图像,如果是视频,则显示视频的第一帧,例如 Instagram,但在 2*2 网格内。

您可以在网格项目布局中同时使用 ImageView 和 VideoView。

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/post_image_size">

            <ImageView
                android:id="@+id/imageView"
                android:layout_width="match_parent"
                android:layout_height="@dimen/post_image_size"/>

            <VideoView
                android:id="@+id/videoView"
                android:layout_width="match_parent"
                android:layout_height="@dimen/post_image_size" />

        </FrameLayout>

在 adapter#getView() 中,您应该检查 url 的类型并设置其中一个,并将另一个设置为不可见。

    if (!isVideo(url)) {
        videoView.setVisibility(View.GONE);
        Picasso.with(this).load(imageUrl)
                .into(imageView);
    } else {
        Uri uri = Uri.parse(url);
        videoView.setVideoURI(uri);
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                imageView.setVisibility(View.GONE);
                videoView.setBackgroundColor(Color.TRANSPARENT);
                videoView.requestFocus();
                videoView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        // start your new activity to play video
                        return false;
                    }
                });
            }
        });
    }

PS1: 我用Picasso设置ImageView。

PS2: 在 Instagram 中,我们可以通过使用 Instagram API 获取视频 post 的图像。我们还有 mediaType 标志来确定它是视频还是图像。您可以从 here. I've developed an instagram repost app. In gridView, I am using the image that is coming from API of a video post. When clicking a video item, I start a new activity to play video as well. But, if you really need capture a frame of a video, you can see this entry.

查看 Instagram API