2017-05-30 36 views
-1

我有一个回收器视图,应显示如下数据(如果位置是偶数,则为1项,如果位置奇数则为2项),并诚实地尝试并尝试但我没有这样做。RecyclerView布局管理器操纵

下面是它应该是什么样子

enter image description here

这里是如何它现在(忽略的宽度和高度,看到3如何将视频充气两次)

enter image description here

我m使用LinearLayoutManager,这里是我的适配器:

public class MediaItemsAdapter extends RecyclerView.Adapter<MediaItemsAdapter.RecyclerViewHolder> { 

private List<MediaItem> allMediaItems; 
private Activity context; 
private RecyclerViewOnItemClickListener itemClickListener; 

public MediaItemsAdapter(Activity context, List<MediaItem> allMediaItems, RecyclerViewOnItemClickListener itemClickListener) { 

    this.allMediaItems = allMediaItems; 
    this.context = context; 
    this.itemClickListener = itemClickListener; 
} 

@Override 
public void onBindViewHolder(final RecyclerViewHolder holder, final int position) { 

    MediaItem mediaItem = allMediaItems.get(position); 

    if(position %2 == 0){ // even 

     holder.tvTitle.setText(mediaItem.getTitle()); 
     holder.tvSummary.setText(mediaItem.getDate()); 

     try { 
      Picasso.with(context) 
        .load(mediaItem.getImageUrl()) 
        .into(holder.ivImage, new com.squareup.picasso.Callback() { 
         @Override 
         public void onSuccess() { 
          holder.ivImage.setAlpha((float) 1); 
         } 

         @Override 
         public void onError() { 
          Log.wtf("error", "in loading"); 
         } 
        }); 

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

     holder.ivPlay.setVisibility(mediaItem.isVideo() ? View.VISIBLE : View.GONE); 
    }else{ //odd 

     holder.tvTitle.setText(mediaItem.getTitle()); 
     holder.tvSummary.setText(mediaItem.getDate()); 

     try { 
      Picasso.with(context) 
        .load(mediaItem.getImageUrl()) 
        .into(holder.ivImage, new com.squareup.picasso.Callback() { 
         @Override 
         public void onSuccess() { 
          holder.ivImage.setAlpha((float) 1); 
         } 

         @Override 
         public void onError() { 
          Log.wtf("error", "in loading"); 
         } 
        }); 

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

     holder.ivPlay.setVisibility(mediaItem.isVideo() ? View.VISIBLE : View.GONE); 

     try{ 

      MediaItem secondMediaItem = allMediaItems.get(position + 1); 
      holder.tvSecondTitle.setText(secondMediaItem.getTitle()); 
      holder.tvSecondSummary.setText(secondMediaItem.getDate()); 

      try { 
       Picasso.with(context) 
         .load(secondMediaItem.getImageUrl()) 
         .into(holder.ivSecondImage, new com.squareup.picasso.Callback() { 
          @Override 
          public void onSuccess() { 
           holder.ivSecondImage.setAlpha((float) 1); 
          } 

          @Override 
          public void onError() { 
           Log.wtf("error", "in loading"); 
          } 
         }); 

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

      holder.ivSecondPlay.setVisibility(secondMediaItem.isVideo() ? View.VISIBLE : View.GONE); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

} 

@Override 
public int getItemViewType(int position) { 
    return position %2 == 0 ? 0 : 1; 
} 

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


public interface RecyclerViewOnItemClickListener { 
    void onItemClicked(View v, int position); 
} 

public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View layoutView; 

    if (viewType == 0){ 

     layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.even_media_layout, parent, false); 
     RecyclerViewHolder rcv = new RecyclerViewHolder(layoutView); 
     return (rcv); 
    }else{ 

     layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.odd_media_layout, parent, false); 
     RecyclerViewHolder rcv = new RecyclerViewHolder(layoutView); 
     return (rcv); 
    } 
} 

public class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    private TextView tvTitle, tvSecondTitle, tvSummary, tvSecondSummary; 
    private ImageView ivImage, ivSecondImage; 
    private ImageButton ivPlay, ivSecondPlay; 

    protected View itemView; 

    public RecyclerViewHolder(View itemView) { 
     super(itemView); 
     this.itemView = itemView; 
     this.itemView.setOnClickListener(this); 

     tvTitle = (TextView) itemView.findViewById(R.id.tvTitle); 
     tvSecondTitle = (TextView) itemView.findViewById(R.id.tvSecondTitle); 
     tvSummary = (TextView) itemView.findViewById(R.id.tvSummary); 
     tvSecondSummary = (TextView) itemView.findViewById(R.id.tvSecondSummary); 

     ivImage = (ImageView) itemView.findViewById(R.id.ivImage); 
     ivSecondImage = (ImageView) itemView.findViewById(R.id.ivSecondImage); 

     ivPlay = (ImageButton) itemView.findViewById(R.id.ivPlay); 
     ivSecondPlay = (ImageButton) itemView.findViewById(R.id.ivSecondPlay); 
    } 

    @Override 
    public void onClick(View view) { 
     itemClickListener.onItemClicked(view, getLayoutPosition()); 
    } 
} 
} 

如何防止数据复制,如何判断数组列表中的对象3是否已经膨胀?有没有比LinearLayoutManager更好的方法

问候。

+0

嗨,欢迎来到Stack Overflow。如果你提供[mcve],你的问题可能会吸引更多的兴趣。就目前来看,这个问题太复杂,而且有太多不相关的部分。 –

回答

0

用户GridLayoutManage到您的RecyclerView并设置像这样的跨度大小查找。

GridLayoutManager glm = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false); 
    glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup(){ 

     @Override 
     public int getSpanSize(int position) { 
      return position % 3 == 0 ? 2 : 1; 
     } 
    }); 
+0

非常感谢 –

0

你的计算是怎么回事错在这里

return position %2 == 0 ? 0 : 1;

看到这个

 
|0| 
1|2 
|3| 
4|5 
|6| 
7|8 

如果你仔细地用3具有全宽度的倍数观察的项目,项目发生。

所以基本上你的计算应该像

return position % 3 == 0 ? 0 : 1;

多一点解释,偶数行有两个项目,但你计算偶数项。

纠正这部分代码太

@Override 
public void onBindViewHolder(final RecyclerViewHolder holder, int position) { 

    final int adapterPosition = holder.getAdapterPosition(); 
    MediaItem mediaItem = allMediaItems.get(adapterPosition); 

    if(adapterPoaition % 3 == 0){ // every third item 
     //your codes 
    } 
    //remaining codes 
} 

这里第一件事情就是你应该使用适配器的位置,而不是被作为参数传递了视图位置。接下来的事情是你也必须在这里使用第三个位置而不是第二个

P.S.你的适配器代码有点乱了,不知道是否纠正 这个计算会给你正确的结果,或者直到你做了 小小的代码清理。

+0

我试过这个返回位置%3 == 0? 0:1,但我的是(第一行一个项目1号,第二行VID2和VID3,THIRD ROW VID3和旁边的空布局)为什么视频3总是复制 –

+0

我已经告诉,您的适配器代码太大以调试当前,并且我假设您的适配器中有更多的计算错误。 –

+0

好吧,我发现了其他错误,在回答中更新了它 –

0

我建议你使用适配器代表,很明显,你可以不用它,但它会帮助你进一步发展。

Here你可以读到它

你应该根据所提供的条件return position % 2 == 1并在onCreateViewHolder()返回相关ViewHolder创建2名代表则在isForViewType()返回布尔(你将有2个)