2017-04-08 66 views
0

RecyclerView提高了查找的列表元素,但我想这样做somethink这样的:多余的元素

enter image description here

正如你所看到的,我只是项目清单,但我想组一些项目并用标题标记它们。

页眉和项目名单属于不同类别(其内部都有其他数据)recyclerView

那么,如何添加两种不同的布局(使用不同的数据)?

回答

1

需要两个不同的布局和两个不同势视图持有人,并在您的适配器,你做到以下几点:

1 - 需要时实施的getItemViewType()方法和返回不同的视图类型(例如基于位置)。您可以定义常量像private static final int VIEW_HEADER = 1;,使其更容易

2 - 在你onCreateViewHolder()的基础上,viewType参数,返回ViewHolder你需要

3 - 在你onBindViewHolder(),请检查您ViewHoldergetItemViewType(),丢给正确的类型和实现结合

下面是一个例子:

public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private final static int VIEW_HEADER = 0; 
    private final static int VIEW_ITEM = 1; 
    private Context context; 

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

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view; 

     if (viewType == VIEW_HEADER) { 
      // Inflate header layout 
      view = LayoutInflater.from(context).inflate(R.layout.elem_header, parent, false); 
      return new HeaderHolder(view); 
     } 

     // Inflate item layout 
     view = LayoutInflater.from(context).inflate(R.layout.elem_item, parent, false); 
     return new ItemHolder(view); 

    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (getItemViewType(position) == VIEW_HEADER){ 
      // Do some header stuff 
      HeaderHolder headerHolder = (HeaderHolder) holder; 
      return; 
     } 


     // Do some item stuff 
     ItemHolder itemHolder = (ItemHolder) holder; 

    } 

    @Override 
    public int getItemCount() { 
     // Do some crazy calcuation to return the number of items you will display (headers + items) 
     return 0; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     // Return the type depending on your logic, could use a modulo or even check some list you've passed 
     return position == 0 ? VIEW_HEADER : VIEW_ITEM; 
    } 

    private class ItemHolder extends RecyclerView.ViewHolder { 

     ItemHolder(View itemView) { 
      super(itemView); 
     } 
    } 


    private class HeaderHolder extends RecyclerView.ViewHolder { 

     HeaderHolder(View itemView) { 
      super(itemView); 
     } 
    } 
}