使用带有 ItemViewType 的多个 ViewHolders
有时,RecyclerView 需要使用几种类型的视图显示在 UI 中显示的列表中,并且每个 View 需要一个不同的布局 xml 才能被充气。
对于此问题,你可以在单个适配器中使用不同的 ViewHolders,方法是使用 RecyclerView 中的特殊方法 - getItemViewType(int position)
。
以下是使用两个 ViewHolders 的示例:
-
用于显示列表条目的 ViewHolder
-
用于显示多个标题视图的 ViewHolder
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(context).inflate(viewType, parent, false); return ViewHolder.create(itemView, viewType); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final Item model = this.items.get(position); ((ViewHolder) holder).bind(model); } @Override public int getItemViewType(int position) { return inSearchState ? R.layout.item_header : R.layout.item_entry; } abstract class ViewHolder { abstract void bind(Item model); public static ViewHolder create(View v, int viewType) { return viewType == R.layout.item_header ? new HeaderViewHolder(v) :new EntryViewHolder(v); } } static class EntryViewHolder extends ViewHolder { private View v; public EntryViewHolder(View v) { this.v = v; } @Override public void bind(Item model) { // Bind item data to entry view. } } static class HeaderViewHolder extends ViewHolder { private View v; public HeaderViewHolder(View v) { this.v = v; } @Override public void bind(Item model) { // Bind item data to header view. } }