13

我正在使用Support Library v7將我的ListView轉換爲RecyclerView。在onCreateViewHolder中獲取位置

我有2個不同的佈局加載在RecyclerView。在ListView中,我獲得了getView()方法中該項目的位置,並且能夠爲該行加載適當的佈局。但在RecyclerView中,onCreateViewHolder沒有位置參數。

有沒有其他辦法可以達到這個目的?

PS:Google的收件箱應用程序在RecyclerView(可能)中顯示不同的佈局。我不認爲他們會在RecyclerView

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     View v=null; 

      MyVO vo = voList.get(???POSITION???); 

      switch(vo.getType()){ 
       case TYPE_1: 
        v = LayoutInflater.from(viewGroup.getContext()) 
          .inflate(R.layout.layout1, viewGroup, false); 
        break; 
       case TYPE_2: 
        v = LayoutInflater.from(viewGroup.getContext()) 
          .inflate(R.layout.layout2, viewGroup, false); 
        break; 
      } 
     return new ViewHolder(v); 
    } 
+0

你的第二個參數是'viewType',我認爲這是你想要的。 – rom4ek 2014-11-03 05:53:39

+0

這就是我最初也想到的。但不是。它只是視圖的類型而不是位置。 – Sathesh 2014-11-03 05:55:27

+0

另一種思考方式:switch(viewType)而不是vo.getType() – 2014-11-03 05:59:31

回答

32

首先使用了ListView由於性能的提升,覆蓋getItemViewType方法:

@Override 
public int getItemViewType(int position) { 
    //Implement your logic here 
    MyVO vo = voList.get(position); 
    return vo.getType(); 
} 

然後,你可以簡單地使用onCreateViewHolder的第二個參數:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v=null; 

     switch(viewType){ 
      case TYPE_1: 
       v = LayoutInflater.from(viewGroup.getContext()) 
         .inflate(R.layout.layout1, viewGroup, false); 
       break; 
      case TYPE_2: 
       v = LayoutInflater.from(viewGroup.getContext()) 
         .inflate(R.layout.layout2, viewGroup, false); 
       break; 
     } 
    return new ViewHolder(v); 
} 
+0

是的。有用。但問題是,在調用notifyDataSetChanged()之後,layout1元素將變爲null,並且onBindViewHolder()中只有layout2元素可用() – Sathesh 2014-11-03 09:26:17

+0

當許多數據項屬於同一個數時,這絕對有效但不是一個好的解決方案視圖類型(例如,在需要在列表中添加頁眉和頁腳的情況下)我不想爲列表中的每個項目創建案例,因爲它們都屬於相同的視圖類型。 – user1841702 2016-07-14 10:01:59