@Override public void bindViewHolder(HOLDER holder, List<ViewItem> viewItems) { unbindViewHolder(holder); for (ViewItem viewItem : viewItems) { final RecyclerView.ViewHolder childViewHolder = getChildViewHolder(viewItem.viewType, getRootViewGroup(holder)); final AdapterViewTypeDelegate delegate = childAdapterViewTypeDelegates.get(viewItem.viewType); delegate.bindViewHolder(childViewHolder, viewItem.model); setChildViewState(childViewHolder, viewItem); getRootViewGroup(holder).addView(childViewHolder.itemView); } }
private void setChildViewState(RecyclerView.ViewHolder childViewHolder, ViewItem viewItem) { ChildViewState childViewState = getChildViewState(childViewHolder.itemView); childViewState.childViewHolder = childViewHolder; childViewState.viewItem = viewItem; }
@Override public void unbindViewHolder(HOLDER holder) { ViewGroup rootViewGroup = getRootViewGroup(holder); if (rootViewGroup.getChildCount() == 0) { return; } // clear / cache child views for (int i = 0; i < rootViewGroup.getChildCount(); i++) { unbindChildView(rootViewGroup.getChildAt(i)); } // clear the view holder rootViewGroup.removeAllViews(); }
@Override public void bindViewHolder(HOLDER holder, List<ViewItem> viewItems, List<Object> payloads) { if (payloads == null || payloads.isEmpty()) { bindViewHolder(holder, viewItems); return; ViewGroup rootViewGroup = getRootViewGroup(holder); for (int i = 0; i < rootViewGroup.getChildCount(); i++) { operations.add(Operation.nilOperation()); switch (operation.type) { case Operation.ADD: RecyclerView.ViewHolder childViewHolder = getChildViewHolder(viewItem.viewType, rootViewGroup); delegate.bindViewHolder(childViewHolder, viewItem.model); rootViewGroup.addView(childViewHolder.itemView, i); setChildViewState(childViewHolder, viewItem); break; ChildViewState childViewState = getChildViewState(rootViewGroup.getChildAt(i)); if (operation.payload != null) { delegate.bindViewHolder(childViewState.childViewHolder, viewItem.model, singletonList(operation.payload)); delegate.bindViewHolder(childViewState.childViewHolder, viewItem.model); setChildViewState(childViewState.childViewHolder, viewItem); break;
private void unbindChildView(View childItemView) { ChildViewState childViewState = getChildViewState(childItemView); AdapterViewTypeDelegate delegate = childAdapterViewTypeDelegates.get(childViewState.viewItem.viewType); delegate.unbindViewHolder(childViewState.childViewHolder); childViewHolderCache.get(childViewState.viewItem.viewType).offer(childViewState.childViewHolder); childViewState.clearViewState(); }