@NonNull
 @Override
 protected RecyclerView.ViewHolder onCreateViewHolderImpl(
     HeaderFooterHelper hfHelper, ViewGroup parent, int viewType) {
   if (hfHelper == null || hfHelper.isLayoutIdInRecord(viewType)) {
     LayoutIdHolder holder = findLayoutIdHolder(viewType);
     return new ViewHolder(
         parent, holder.mMainLayoutId, holder.mMenuLayoutId, getTrackingEdge(), mSwipeListener);
   } else {
     return new ViewHolder(hfHelper.findView(viewType, getAdapterManager().getItemSize()));
   }
 }
  @Override
  protected int getItemViewTypeImpl(HeaderFooterHelper hfHelper, int position) {
    final T t = getItem(position);
    int layoutId = getItemLayoutId(position, t);
    int menuLayoutId = getItemMenuLayoutId(position, layoutId, t);

    int viewType;
    final LayoutIdHolder holder = new LayoutIdHolder(layoutId, menuLayoutId);
    // same layoutId && same  menuLayoutId ?  indicate -> same viewType
    Integer val = mViewTypeMap.get(holder);
    if (val == null) {
      viewType = --mMinValueType;
      holder.mViewType = viewType;
      mViewTypeMap.put(holder, viewType);
      if (hfHelper != null) hfHelper.recordLayoutId(viewType);
    } else {
      viewType = val;
    }
    return viewType;
  }