在 RecyclerView 中混合的图像 + 视频

Posted

技术标签:

【中文标题】在 RecyclerView 中混合的图像 + 视频【英文标题】:Images + Videos mixed in a RecyclerView 【发布时间】:2016-11-27 15:04:55 【问题描述】:

我正在尝试检查 RecyclerView 中的图像和视频的可用性,但挑战是 VideoView 是所有项目列表中唯一可见的,ImageView 根本不可见,我想要什么是检查 ImageView 中是否存在 ImageView 的 Videoview GOES,以及视频何时在 VideoView ImageView Goes 中可用。

我正在开发一个应用程序,它可以发布视频和图像并在同一个 RecyclerView 中检索它们,所以请帮助我如何实现这一目标

下面是我的代码,但它不起作用:

boolean hasDrawable = (viewHolder.imagePost.getDrawable()!= null);

String hasVideo_string =(String)viewHolder.videoLayout.getTag();
boolean hasVideo = Boolean.parseBoolean(hasVideo_string);

if(hasDrawable)
   viewHolder.setTitle(model.getEventTitle());
   viewHolder.setDesc(model.getEventDescription());
   viewHolder.setImage(c, model.getEventImage());
   viewHolder.videoLayout.setVisibility(View.INVISIBLE);
   

else if(hasVideo) 
  viewHolder.setTitle(model.getEventTitle());
  viewHolder.setDesc(model.getEventDescription());
  viewHolder.setVideo(c, model.getEventVideo());
  viewHolder.imagePost.setVisibility(View.GONE);
  

这就是我在 ViewHolder 类中设置图像和视频的方式

public void setImage(final Context c,final String imageUrl)
    //
    Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).fit().centerInside().placeholder(R.mipmap.add_btn)
                    .networkPolicy(NetworkPolicy.OFFLINE).into(imagePost, new Callback() 
                @Override
                public void onSuccess() 

                

                @Override
                public void onError() 

                    //Reloading an image again ...
                    Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).placeholder(R.mipmap.add_btn)
                            .into(imagePost);
                
            );

        

还有视频(我使用了一个名为 FullscreenVideoLayout 的库,它类似于 VideoView,但经过了很多定制)

public void setVideo(final Context c, final String videoUrl)

   // videoLayout.setActivity(this);
   // videoLayout.setActivity(get);

    Uri videoUri = Uri.parse(videoUrl);
    try 
        videoLayout.setVideoURI(videoUri);
        videoLayout.setTag(videoUrl);

     catch (IOException e) 
        e.printStackTrace();
    

这是完整的ViewHolder

public static class BlogViewHolder extends RecyclerView.ViewHolder


        View mView;
        private ImageView imagePost;
        private FullscreenVideoLayout videoLayout;
          private VideoView videoView;

        public BlogViewHolder(View itemView) 
            super(itemView);
            mView=itemView;
          imagePost =(ImageView)mView.findViewById(R.id.post_image);
           videoLayout = (FullscreenVideoLayout) mView.findViewById(R.id.post_video);

        
        public void setTitle(String title)

            TextView post_title = (TextView)mView.findViewById(R.id.post_title);
            post_title.setText(title);

        

        public void setDesc(String desc)

            TextView post_desc = (TextView)mView.findViewById(R.id.post_desc);
            post_desc.setText(desc);
        


        public void setImage(final Context c,final String imageUrl)

       //

            Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).fit().centerInside().placeholder(R.mipmap.add_btn)
                    .networkPolicy(NetworkPolicy.OFFLINE).into(imagePost, new Callback() 
                @Override
                public void onSuccess() 

                

                @Override
                public void onError() 

                    //Reloading an image again ...
                    Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).placeholder(R.mipmap.add_btn)
                            .into(imagePost);
                
            );

        

        public void setVideo(final Context c, final String videoUrl)


           // videoLayout.setActivity(this);
           // videoLayout.setActivity(get);

            Uri videoUri = Uri.parse(videoUrl);
            try 
                videoLayout.setVideoURI(videoUri);
                videoLayout.setTag(videoUrl);

             catch (IOException e) 
                e.printStackTrace();
            


        

            

【问题讨论】:

您是否检查过 hasVideo/hasDrawable 标志是否设置正确?你在哪里/如何设置 videoLayout 标签和 imagePost drawable? 我已经更新了我的帖子@daemontus,检查我是如何设置它们的 好吧,我的猜测是,当你调用 getDrawable() 时,毕加索还没有在视图中设置任何东西(它在后台做了很多事情,有时很难确切地告诉某些事情何时会发生)。所以我的建议是做这样的事情: boolean hasImage = /*你用来决定是否首先调用 setImage 的任何条件*/; boolean hasVideo = /*无论你使用什么条件来决定是否调用 setVideo*/; if (hasImage) setImage(); imagePost.setVisibility(INVISIBLE) else if (hasVideo) 视频相同 @daemontus ,感谢您的解释,但它让我有点困惑,请您尝试为我编辑答案我还发布了完整的Viewholder 课程,我仍然是这方面的初学者东西。谢谢 @daemontus,请帮我解决这个问题,我卡住了,我很乐意为您提供帮助 【参考方案1】:

我看到您正在使用Firebase,因此由于您获得了视频和图像getEventImage()getEventVideo()Urls,因此只需检查Urls 是否为空并删除ImageViewVideoView

下面是示例代码,试试这个:

 public void setImage(final Context c,final String imageUrl)

            try 
                if (imageUrl!=null) 
                    //

                    Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).fit().centerInside().placeholder(R.mipmap.add_btn)
                            .networkPolicy(NetworkPolicy.OFFLINE).into(imagePost, new Callback() 
                        @Override
                        public void onSuccess() 

                        

                        @Override
                        public void onError() 

                            //Reloading an image again ...
                            Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).placeholder(R.mipmap.add_btn)
                                    .into(imagePost);
                        
                    );





                 else 

                    imagePost.setVisibility(View.GONE);
                
            
            catch (Exception e)

            

        

        public void setVideo(final Context c, final String videoUrl)
            try 
                if (videoUrl!=null) 
                    try 
                        Uri videoUri = Uri.parse(videoUrl);
                        try 
                            videoLayout.setVideoURI(videoUri);
                            videoLayout.setTag(videoUrl);
                            String hasVideo_string = (String) videoLayout.getTag();
                            boolean hasVideo = Boolean.parseBoolean(hasVideo_string);


                         catch (IOException e) 
                            e.printStackTrace();
                        
                     catch (Exception e) 
                        System.out.println("Error :" + e);
                    

                 else 
                    videoLayout.setVisibility(View.GONE);
                
            
            catch (Exception e)

            


        

希望它对你有用。

【讨论】:

以上是关于在 RecyclerView 中混合的图像 + 视频的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Recyclerview 中显示图像 - Recyclerview 图像显示错误

RecyclerView初探

Android:在 Recyclerview 中更改图像旋转

如何在 RecyclerView 中显示“重”图像?

旋转后recyclerview行中的图像消失

如何从 recyclerview 裁剪图像并使用新裁剪的图像更新 recyclerview?