2017-05-30 68 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個)