【问题标题】:Recyclerview : how to mix some post with image and no image? [duplicate]Recyclerview:如何将一些帖子与图像和没有图像混合? [复制]
【发布时间】:2026-01-12 15:10:01
【问题描述】:

我想在同一个回收视图中显示,即有些帖子有图片,有些帖子没有图片。

我可以检索所有带有图片和非图片的帖子, 但是当用户只发布文本(无图像)时,我想更改帖子的大小。

我希望像 twitter 提要这样的输出..一些带有图片和不带图片的帖子有自己的大小。

【问题讨论】:

  • 没有图像时可以显示一个图像视图,否则可以隐藏它显示
  • 您可以根据条件将 Imageview 的 Visibility 设置为 Gone 或 Visible。
  • 您要做的是创建一个具有多种视图类型的适配器。可能重复:*.com/questions/26245139/…
  • 我建议使用默认图像,如果没有图像可用,它将覆盖。

标签: java android android-recyclerview


【解决方案1】:

正如一些人已经说过的,一种可能的解决方案是隐藏/显示 ImageView。

您可以在用于 RecyclerView 的 ViewHolder 中执行此操作。

class OptionalImageViewHolder extends RecyclerView.ViewHolder {
    private ImageView image;
    private TextView text;
    // any other views you have

    public OptionalImageViewHolder(View itemView) {
        super(itemView);
        image = itemView.findViewById(R.id.yourImageViewIdHere);
        text = itemView.findViewById(R.id.yourTextViewIdHere);
        // same for any other views you have
    }

    public void bindView(Tweet tweet) {
        // This is where the magic happens
        // Note: I make the assumption that you have a class called "Tweet"
        // that has a field for "text", a field for "image" (that can be
        // null if there's no image), and any other necessary fields.

        text.setText(tweet.getTweetText());
        if (tweet.hasImage() /* function that returns whether or not there is an image */) {
            image.setVisibility(View.VISIBLE);
            image.setImageBitmap(tweet.getImage()); // or however you are setting the image
        } else {
            // else just make the image invisible
            image.setVisibility(View.GONE);
        }
    }
}

希望这能给你一个想法。

【讨论】:

    【解决方案2】:

    另一种可能的解决方案是创建 2 个 xml 布局并在 RecyclerView 中使用 ViewType。

    看看这个How to create RecyclerView with multiple view type?

    【讨论】:

      【解决方案3】:

      RecyclerView 支持不同的视图类型(布局),这在这种情况下是正确的方式。例如,

      class MyAdapter : RecyclerView.Adapter<MyViewHolder>() {
      
        override fun getViewTypes(position:Int) =
          if (mydata[position].hasImage) return R.layout.mylayout_with_image
          else R.layout.mylayout_no_image;
      
        override fun onCreateViewHolder(viewType:Int, parent:ViewGroup) : MyViewHolder =
          // here viewType = layout id
          MyViewHolder(layoutInflater.inflate(viewType, parent))
      
        override fun onBindViewHolder(viewHolder:MyViewHolder, position:Int) {
          // guaranteed viewHolder.itemView is the view you want for that position
        }
      
      }
      

      【讨论】:

      • (mydata[position].hasImage) 我有用户图片和帖子图片..
      【解决方案4】:

      实现这种情况的简单方法是,您所要做的就是创建一个包含图像和文本的视图,在回收器适配器中检查图像数据是否可用,使图像的可见性可见,否则图像可见性消失。

      第二种方法为RecyclerView创建多个视图。

       @Override
       public void onBindViewHolder(ViewHolder holder, int position) {
      
              Log.d(TAG, "onBindViewHolder called");        
              ContentItem item = mContentItems.get(position);
      
              if(item.getName()!=null){
                   holder.textName.setVisibility(View.Visible);
                   holder.textName.setText(item.getName());        
              }else{
                   holder.textName.setVisibility(View.GONE);
              }
      
             if(item.getPreviewImageDefault()!=null){
                   holder.imageIcon.setVisibility(View.Visible)        
                   Picasso.with(mContext).load("file://" + item.getPreviewImageDefault()).into(holder.imageIcon);  
             }else{
                   holder.imageIcon.setVisibility(View.GONE)
             }
       }
      

      【讨论】:

        【解决方案5】:

        如果您想在图像为ic_launcher 时隐藏图像,您可以这样做(假设data.getImage() 将drawable 的id 作为整数返回):

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int i) {
        
           if(mItems!=null){
              AdapterData data = mItems.get(i);
              viewHolder.text.setText(data.getText());
              viewHolder.image.setImageResource(data.getImage());
        
              if(TextUtils.isEmpty(data.getText())){
                 viewHolder.text.setVisibility(View.GONE);
              }else{
                 viewHolder.text.setVisibility(View.VISIBLE);
              }
        
              if(data.getImage()==R.drawable.ic_launcher){
                 viewHolder.image.setVisibility(View.GONE);
              }else{
                 viewHolder.image.setVisibility(View.VISIBLE);
              }
          }
        
        }
        

        【讨论】: