2016-08-30 10 views
0

iOSの場合UITableViewは 'セクション'を持ち、セクション '行'の内側にあります。これはRecycleViewでAndroidで可能ですか?AndroidでRecyclerViewのセクションを定義することはできますか?

RecyclerView.Adapterは、getItemCount()代理人メソッドのみを持ちます。しかし、セクションのためのものはありません。提案できる選択肢は何ですか?

私はセクションヘッダーを1行に入れ、セクションを1つのグローバルセクションに溶かしていると思ったので、セクションは必要ありません。どんな良いアイデア?

+1

私は同意しないを助けるかもしれないダミーRecyclerViewAdapterです。私はこれが合理的な質問だと思う。 –

答えて

1

RecyclerView.Adapterは、複数のビュータイプをサポートしています。特定の位置に表示する項目の種類はあなた次第です。

@Override 
public int getItemViewType(int position) { 
    if (isHeader(position)) { 
     return TYPE_HEADER; 
    } else { 
     return TYPE_ITEM; 
    } 
} 

はその後、あなたはそれを利用するために、適切なレイアウトを膨らませるonCreateViewHolderを使用してonBindViewHolderすることができます:あなたはTYPE_HEADERとTYPE_ITEM 2つの項目の種類を定義する場合は、簡単に、たとえば、セクションを作成するためにそれを使用することができます。

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == TYPE_HEADER) { 
     View v = ... ; // inflate here 
     return new HeaderViewHolder(v); 
    } else { 
     View v = ... ; // inflate here 
     return new ItemViewHolder(v); 
    }  
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    if (holder instanceof HeaderViewHolder) { 
     // handle header 
    } else if (holder instanceof ItemViewHolder { 
     // handle item 
    } 
} 

残っているのは、物事を保存するためのデータ構造です。それを実装する方法はたくさんありますし、あなたの質問の範囲から少し外れていると思います。データ構造が非常に深い場合は、私は以前に作ったカスタムツリーのような構造を使うことを好みますが、フラットListを使用し、instanceofを使用して項目タイプをチェックすることがあります。

0

オーバーライドgetItemViewType()あなたのセクションのタイプを返すメソッド。そしてonCreateViewHolder()メソッドでは、タイプに応じてレイアウトを膨張させます。

ついにonBindViewHolder()方法で再び

次の種類に応じて、あなたのビューをレンダリングすることは、あなたに

class CustomRecyclerViewAdapter extends RecyclerView.Adapter<CustomRecyclerViewAdapter.ViewHolder> { 
     public final int NEWS_LAYOUT = 0; 
     public final int ARTICLE_LAYOUT = 1; 
     public final int PROGRESS_BAR_LAYOUT = 2; 
     ArrayList<YourModel> list; 
     Context context; 

     public CustomRecyclerViewAdapter(Context context) { 
      this.context = context; 
     } 

     @Override 
     public CustomRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                     int viewType) { 

      ViewHolder vh = null; 
      View v; 
      switch (viewType) { 
       case NEWS_LAYOUT: 
        v = LayoutInflater.from(parent.getContext()) 
          .inflate(R.layout.layout_card_view, parent, false); 
        vh = new ViewHolder(v, viewType); 
        break; 
       case ARTICLE_LAYOUT: 
        v = LayoutInflater.from(parent.getContext()) 
          .inflate(R.layout.layout_card_view, parent, false); 
        vh = new ViewHolder(v, viewType); 
        break; 
       case PROGRESS_BAR_LAYOUT: 
        v = LayoutInflater.from(parent.getContext()) 
          .inflate(R.layout.progress_bar, parent, false); 
        vh = new ViewHolder(v, viewType); 
        break; 
       default: 
        break; 
      } 
      return vh; 
     } 

     @Override 
     public void onBindViewHolder(ViewHolder holder, int position) { 
      try { 
       //assign data according to your types 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 

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


     public void addAll(List list) { 
      if (null == this.list) 
       this.list = new ArrayList<>(; 
      else { 
       this.list.addAll(list); 
      } 
     } 

     public void clear() { 
      list.clear(); 
     } 

     @Override 
     public int getItemViewType(int position) { 
       if (list.get(postion).getType().equals("News Layout")) { 
        return NEWS_LAYOUT; 
       } else if (list.get(postion).getType().equals("Article Layout")) { 
        return ARTICLE_LAYOUT; 
       } else if (list.get(postion).getType().equals("progressbar")) 
        return PROGRESS_BAR_LAYOUT; 
       } 
      return -1; 
     } 

     public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
      public CardView cardView; 
      public ProgressBar progressBar; 

      public ViewHolder(View view, int type) { 
       super(view); 
       if (type == NEWS_LAYOUT || type == ARTICLE_LAYOUT) { 
        this.cardView = (CardView) view.findViewById(R.id.card_view); 
        this.cardView.setOnClickListener(this); 
       } else if (type == PROGRESS_BAR_LAYOUT) { 
        this.progressBar = (ProgressBar) view.findViewById(R.id.recycler_view_progress_bar); 
       } 
      } 

      @Override 
      public void onClick(View view) { 
       //perform operations 
      } 
     } 
    } 
関連する問題