2016-07-30 9 views
1

現在、Recyclerviewがあるアンドロイドプロジェクトに取り組んでいます。 Recyclerview異なるタイプのアイテムを保持します。アイテムは異なるファイル(Doc、Pdf、Images、Videos)です。私はGridlayoutmanagerを使用しています。私はrecyclerviewの行として2つのタイプのビューを膨らませたい、1つのビューはイメージとビデオ用で、別のビューは他のタイプのファイル(doc、pdfなど)用です。どのタイプのファイルがどの順序であるかを知っている。私はgetItemViewTypeonCreateViewHolderを使って行を膨らませる必要があることを知っている。私が行を最初に膨らませる一般的な方法を使用し、すべてのファイルがランダムであるため、行の種類を膨張させて行を埋めても機能しません。私はファイルの種類に応じて行を膨らませたい。必要なタイプを膨らませるためにgetItemViewTypeonBindViewHolderからトリガーする必要があるかもしれません。私はSOで質問を読んだ。この問題に直接関係する質問はありません。すべての質問が最初に行を膨らませ、行の詳細を埋めています。どのようなアイデアの詳細(私の場合のファイル)の種類に応じて膨らませる方法?実装アダプタでは、この方法をRecyclerViewの各行のデータの種類に応じて行のビューを拡大します

class ViewHolder{ 

    public ViewHolder(View v, int type){ 

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

答えて

1

あなたの内部アダプタクラスを作成

Iは種類に応じて、最初の行を膨張及び行を充填された一般的な方法を使用する場合
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方法:アダプターで実装する

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 
} 

次の方法:

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 

} 

アダプタでの最後の事:

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

    if (holder.type==VIEW_VIDEO){ 

     //staff on video 
    } 
} 
+0

おかげでビューを作成してバインドするようになったバインドビューホルダーインチ'getItemViewtype'では、行がVideoファイルかNormalファイルかを" position "パラメータを使って確認することはできません。ファイルは混在しています。その位置を使ってファイルの種類を言うことはできません。それが私の問題です。 – Naroju

+0

だからあなたはそれが何であるかを知っていますか?あなたはアダプターのどのデータを持っていますか? –

+0

ファイル名(Strings)の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 

} 

長い話を短く、作成・ビュー・ホルダーとあなたがそのビュータイプに基づいて、返信用

関連する問題