【问题标题】:Loading Videos and Images on a RecyclerView once在 RecyclerView 上加载视频和图像一次
【发布时间】:2016-11-22 08:22:28
【问题描述】:

如何将图像和视频加载到 RecyclerView 的同一列表中,以便当我点击它可以播放的视频(如 Facebook 博客样式)时,可以看到 Facebook 上的图像以及 @ 上的视频987654323@的一个列表,有没有这方面的教程请帮帮我。我真的被困住了,我对此没有任何解决方案。

如何用图片和视频制作一个RecyclerView

下面是我的onStart 方法它在哪里有FirebaseRecyclerAdapter 它启动列表

  @Override
    protected void onStart() {
        super.onStart();

        //checkUserExists();
       // mAuth.addAuthStateListener(mAuthLitsener);
try {
    FirebaseRecyclerAdapter<Posts, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Posts, BlogViewHolder>(Posts.class,
            R.layout.item_activity,
            BlogViewHolder.class,
            mDatabase) {
        @Override
        protected void populateViewHolder(BlogViewHolder viewHolder, final Posts model, final int position) {



            final String key_post = getRef(position).getKey();
            viewHolder.setTitle(model.getEventTitle());
            viewHolder.setDesc(model.getEventDescription());
            viewHolder.setImage(c, model.getEventImage());
            viewHolder.setVideo(c,model.getEventImage());

            viewHolder.imagePost.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Toast.makeText(getApplicationContext(),""+key_post,Toast.LENGTH_LONG).show();
                    Intent singleView = new Intent(MainActivity.this,ViewSingleImage.class);
                    singleView.putExtra("Blog",key_post);
                    singleView.putExtra("EventName",eventname);
                    startActivity(singleView);
                }
            });

        }
    };

    mRecyclerview.setAdapter(firebaseRecyclerAdapter);
}
catch (Exception ex){

    System.out.println("Error "+ ex);
}
    }

这是MyViewHolder 类,我在其中声明了图像和网址

 public static class BlogViewHolder extends RecyclerView.ViewHolder{


        View mView;
        private ImageView imagePost;

        public BlogViewHolder(View itemView) {
            super(itemView);
            mView=itemView;
            imagePost =(ImageView)mView.findViewById(R.id.post_image);
        }
        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 = (FullscreenVideoLayout) mView.findViewById(R.id.post_video);
           // videoLayout.setActivity(this);
           // videoLayout.setActivity(get);

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

            } catch (IOException e) {
                e.printStackTrace();
            }


        }


    }

所以一般来说,在ViewHolder中我声明了图像和视频,所以在OnStart方法中我放置了我的适配器以便下载ImageUrlVideoUrl,但是逻辑在我这边检查它们仍然很棘手

【问题讨论】:

  • 请查看以下链接并在 Viewholder 中使用图像和文本视图,并在 onBindViewHolder() 方法创建视图之前检查条件。 stackoverflow.com/questions/30978030/…
  • @Chayan,感谢您的回复,但是当我看到您发送的帖子链接时,它只是关于视频,我想要的是当该人发布它加载到列表中的图像时以及何时该人也在 RecyclerView 中发布了它加载的视频,我希望它在加载图像和视频时具有自动感知(就像 facebook 一样)。
  • @huzaifah--- 你是从服务器获取图像 URL 和视频 URL 吗??如果你正在从服务器获取对象类型,无论是图像还是视频,然后在 OncreateViewHolder( ) 方法并在 obBindView() 方法中绑定数据。你想给我发一些 Pescudo 代码吗
  • 拜托,请@Chayan,帮我解决这个问题,给我一些代码示例
  • @Chayan,请稍候....帮帮我:)

标签: java android video firebase android-imageview


【解决方案1】:
Please do following way:--

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

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

<ImageView
    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true" />

 </RelativeLayout>

    In Adapterclass:---
    public class MyRecyclerViewAdapter extends RecyclerView
    .Adapter<MyRecyclerViewAdapter
    .DataObjectHolder> {
    private static String LOG_TAG = "MyRecyclerViewAdapter";
    private ArrayList<DataObject> mDataset;
    private static MyClickListener myClickListener;

    public static class DataObjectHolder extends RecyclerView.ViewHolder
        implements View
        .OnClickListener {
     TextView label;
     TextView dateTime;

     public DataObjectHolder(View itemView) {
        super(itemView);
        label = (TextView) itemView.findViewById(R.id.textView);
        dateTime = (TextView) itemView.findViewById(R.id.textView2);
        Log.i(LOG_TAG, "Adding Listener");
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        myClickListener.onItemClick(getPosition(), v);
    }
}

  public void setOnItemClickListener(MyClickListener myClickListener) {
    this.myClickListener = myClickListener;
}

  public MyRecyclerViewAdapter(ArrayList<DataObject> myDataset) {
    mDataset = myDataset;
}

  @Override
  public DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recyclerview_item, parent, false);

    DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
    return dataObjectHolder;
}

   @Override
   public void onBindViewHolder(DataObjectHolder holder, int position) {
    DataObject dataset=mDataset.get(position)
   //   Check here image or video
     if(mdataset contains  image){
         videoview invisible or gone
    }else{
         image invisible or gone
    )

   public void addItem(DataObject dataObj, int index) {
    mDataset.add(dataObj);
    notifyItemInserted(index);
}

   public void deleteItem(int index) {
    mDataset.remove(index);
    notifyItemRemoved(index);
}

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

     public interface MyClickListener {
     public void onItemClick(int position, View v);
}

}

【讨论】:

【解决方案2】:

我可以看到你正在使用Firebase,所以你得到了getEventImage()getEventVideo(),所以你必须检查Urls是否为空或setImage()setVideo()方法。试试这个代码。看看:

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){

            }


        }

希望这行得通。

【讨论】:

  • 谢谢@Lutaaya,这是一个很好的简单逻辑,我被卡住了,谢谢老兄:)
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 2018-12-18
  • 2015-12-21
  • 2012-03-14
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多