2016-07-30 57 views
1

我目前正在致力於一個Android項目,其中有一個Recyclerview。 Recyclerview保存不同類型的項目。項目是不同的文件(文檔,PDF,圖像和視頻)。我正在使用Gridlayoutmanager。我想在循環播放視圖中將兩種視圖充滿行,一種視圖是圖像和視頻,另一種視圖是其他類型的文件(doc,pdf等)。所有文件都是混合的,噸知道哪種類型的文件順序。我知道我必須使用getItemViewTypeonCreateViewHolder膨脹行。如果我使用的是普通的方式,先膨脹行,然後根據膨脹行的類型填充行不起作用,因爲所有的文件都是隨機的。我想根據文件的類型膨脹行。可能是我需要從onBindViewHolder觸發getItemViewType,以擴大所需的類型。我已經閱讀過SO中的問題。沒有問題直接關係到這個問題。所有的問題都是先將行膨脹並填充行中的細節。任何想法如何膨脹取決於細節類型(我的案例中的文件)?根據RecyclerView的每一行中的數據類型膨脹視圖的行數

回答

1

創建內部您適配器類:

class ViewHolder{ 

    public ViewHolder(View v, int type){ 

     super(itemView); 
     this.type=type; //here we have type of view holder 
    } 
} 

在適配器實現方法:

final int VIEW_VIDEO=2; 
final int VIEW_STANDARD=1; 
public int getItemViewType(int position) { 

    //here return some view type 
    if (isVideo(position)){ //example method checking is video row 

     return VIEW_VIDEO; 
    }else{ 

     return VIEW_STANDARD 
    } 
} 

如果使用,其根據所述類型第一膨脹所述行和填充所述行一般的方式的行充氣不起作用,因爲所有的文件都是隨機的

I n getItemViewType您有位置,所以也許這是可以檢查此行中的文件類型。如果你的適配器有數據(如果列表顯示那麼肯定有),那麼可以檢查我們需要在視圖上設置什麼類型的文件。

例isVideo方法檢查的文件擴展名:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 

    View v; 

    if (viewType==VIEW_VIDEO){ 

     v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.video_layout, parent, false); 
    }else{ 

     v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.standard_layout, parent, false); 
    } 

    return new ViewHolder(v,viewType); //here we have view holder with right view 

} 

最後一件事在適配器:

private boolean isVideo(position){ 

    String filename=list.get(position); //list Your Strings 
    String filenameArray[] = filename.split("\\."); 
    String extension = filenameArray[filenameArray.length-1]; 
    return extension=="mp4"; //change this to more flexible 
} 

適配器來實現Next方法

public void onBindViewHolder(final ViewHolder holder, int position){ 

    if (holder.type==VIEW_VIDEO){ 

     //staff on video 
    } 
} 
+0

感謝您的答覆。在'getItemViewtype'中,我無法檢查該行是否只是使用「position」參數的Video文件或Normal文件。文件是混合的。我不能通過使用它的位置來說出文件的類型。這是我的問題。 – Naroju

+0

所以當你知道它是什麼?你有什麼數據適配器? –

+0

我將一個ArrayList的文件名(字符串)輸入到Adapter類的構造函數中。所以ArrayList包含文件名隨機,我不知道哪種文件類型的particuler位置。有沒有一種方法可以根據文件擴展名進行膨脹? – Naroju

0

實際上有許多解決方案,但這是我的最愛:

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.FeedItemHolder> { 

    static final int VIEW_TYPE_HEADER = 0; 
    static final int VIEW_TYPE_NORMAL = 1; 
    static final int VIEW_TYPE_FOOTER = 2; 

    @Override 
    public FeedItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     logd("create view holder called"); 

     int resid = 0; 

     if (viewType == VIEW_TYPE_HEADER) { 
      resid = R.layout.item_header; 
     } else if (viewType == VIEW_TYPE_NORMAL) { 
      resid = R.layout.item_normal; 
     } else if (viewType == VIEW_TYPE_FOOTER) { 
      resid = R.layout.item_footer; 
     } 

     View v = LayoutInflater.from(context).inflate(resid, parent, false); 
     return new FeedItemHolder(context, viewType); 
    } 

    private void bindNormal(FeedItemHolder holder, int position) { 
     // specialized bind method for normal items 
     ... 
    } 

    private void bindHeader(FeedItemHolder holder, int position) { 
     // specialized bind method for header items 
     ... 
    } 

    private void bindFooter(FeedItemHolder holder, int position) { 
     // specialized bind method for footer items 
     ... 
    } 

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

     int viewType = getItemViewType(position); 

     if (viewType == VIEW_TYPE_HEADER) { 
      bindHeader(holder, position); 
     } else if (viewType == VIEW_TYPE_NORMAL) { 
      bindNormal(holder, position); 
     } else if (viewType == VIEW_TYPE_FOOTER) { 
      bindFooter(holder, position); 
     } 

    } 

    @Override 
    public int getItemViewType(int position) { 

     // determine view type, e.g: 
     // 
     // if (position == 0) 
     //  return VIEW_TYPE_HEADER; 
     // else if (postion > itemCount) 
     //  return VIEW_TYPE_FOOTER; 
     // else 
     //  return VIEW_TYPE_NORMAL; 

     ... 
    } 

    private View.OnClickListener showCommentsListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (holder != null) { 
       TimelineEntryRaw entry = (TimelineEntryRaw) v.getTag(); 
       holder.onCommentsRequest(entry, false); 
      } 
     } 
    }; 

    public class FeedItemHolder extends RecyclerView.ViewHolder { 

     private View root; 

     // header items' views 
     private TextView title; 
     ... 

     // normal items' views 
     private TextView contentText; 
     ... 

     // footer items' views 
     private View loadMoreBtn; 
     ... 

     public FeedItemHolder(View itemView, int itemType) { 

      // the call to parent constructor is the only 
      // reason android knows which view to show 
      super(itemView); 

      root = itemView; 

      if (itemType == VIEW_TYPE_HEADER) { 

       // fetch header item views 
       loadMoreBtn = findView(itemView, R.id.item_header__title); 
       ... 

      } 

      if (itemType == VIEW_TYPE_NORMAL) { 

       // fetch views for normal item 
       contentText = findView(itemView, R.id.item_normal__content); 
       ... 

      } 

      if (itemType != VIEW_TYPE_FOOTER) { 

       // fetch views for footer item 
       loadMoreBtn = findView(itemView, R.id.item_footer__btn); 
       ... 

      } 

     } // end Holder constructor 


    } // end class Holder 

} 

長話短說,在創建視圖持有者和綁定視圖持有者你有基於其視圖類型來創建和綁定視圖