 
     struct ViewStatus {
         var view:BXView
+        var classifier:String
         var available:Bool
     }
     // Classifyed recyclable views

                    vs.view.frame.origin.x > superview.frame.origin.x + superview.frame.width + self.minOffScreenDistance ||
                    vs.view.frame.origin.y + vs.view.frame.height + self.minOffScreenDistance < superview.frame.origin.y ||
                    vs.view.frame.origin.y > superview.frame.origin.y + superview.frame.height + self.minOffScreenDistance {
                    self._recycleView(view: vs.view)
                }
            }
        }
    }

    /// Returns a Recyclable view
    ///
    /// - Parameter viewFactory: the factory method to create a new view
    /// - Returns: the view
    open func getARecyclableView<T:BXView>(viewFactory:()->(T))->T{
        if let view = self._recyclableViews[T.className()]?.popLast() as? T{
            return view
        }
        let view = viewFactory()
        let vs = ViewStatus(view: view, available: false)
        self._viewsStatus.append(vs)
        return view
    }

    /// - Parameters:
    ///   - view: the view to recycle
    ///   - groupedBy: its group
    fileprivate func _recycleView(view:BXView,classifiedBy:String){
        var group:[BXView]!
        if let existingGroup=_recyclableViews[classifiedBy] {
            group = existingGroup
        }else{
            group = [BXView]()
        }
        group.append(view)
        view.removeFromSuperview()
        self._recyclableViews[classifiedBy]=group
        // Update the view status
        if var vs = self._viewsStatus.first(where: { (viewStatus) -> Bool in
            return viewStatus.view == view
