public void SetVisible(VerticalViewport viewport, bool visible, bool forceValidate)
            {
                if (visible == mVisible && !forceValidate)
                {
                    return;
                }
                mVisible = visible;
                if (visible)
                {
                    if (dataEntity == null)
                    {
                        dataEntity = viewport.mObjectBuffer[prototype].Get();// .GetAnyTarget(prototype);
                        dataEntity.OnBindData(info);
                    }
                    if (!dataEntity.gameObject.activeSelf)
                    {
                        dataEntity.gameObject.SetActive(true);
                    }
                    var     trans     = dataEntity.rectTransform;
                    Rect    localrect = new Rect(position.x, position.y - size.y, size.x, size.y);
                    Vector3 pos       = Vector3.zero;
                    pos.x = Mathf.Lerp(localrect.xMin, localrect.xMax, trans.pivot.x);
                    pos.y = Mathf.Lerp(localrect.yMin, localrect.yMax, trans.pivot.y);
                    dataEntity.SetLocalPosition(pos);
                }
                else if (dataEntity != null)
                {
                    dataEntity.OnUnbindData();
                    viewport.mObjectBuffer[prototype].Add(dataEntity);// .SaveBuffer(prototype, dataEntity);
                    if (viewport.m_MoveCachedItemOutOfBounds && viewport.m_ClipRect != null)
                    {
                        var   rect = _2DUtil.CalculateRelativeRect(viewport.transform, viewport.m_ClipRect);
                        var   p    = dataEntity.transform.localPosition;
                        float l    = Mathf.Abs(p.x - rect.xMin);
                        float r    = Mathf.Abs(p.x - rect.xMax);

                        if (l < r)
                        {
                            p.x = rect.xMin - rect.width;
                        }
                        else
                        {
                            p.x = rect.xMax + rect.width;
                        }
                        dataEntity.transform.localPosition = p;
                    }
                    else if (dataEntity.gameObject.activeSelf)
                    {
                        dataEntity.gameObject.SetActive(false);
                    }
                    dataEntity = null;
                }
            }
            public void SetVisible(VerticalViewport viewport, bool visible, bool forceValidate)
            {
                var n = firstData;

                while (n != null)
                {
                    n.SetVisible(viewport, visible, forceValidate);
                    if (n == lastData)
                    {
                        break;
                    }
                    n = n.next;
                }
            }