/// <summary> /// ScrollView的Content /// </summary> /// <param name="value">value必须是list[AStateBase] 类型 </param> private void SetProp_Contents(Transform trans, object value) { ScrollRectAdaptor srlogic = null; if (!srlogicMap.TryGetValue(trans.GetHashCode(), out srlogic)) { var sr = trans.GetComponent <ScrollRect>(); srlogic = new ScrollRectAdaptor(sr); srlogicMap[trans.GetHashCode()] = srlogic; } //遍历Conent进行赋值操作 var sourceList = value as IList; //这里做适配演示, //一般ScrollRect不会把所有的数据加载出来 var count = Mathf.Max(srlogic.Contents.Count, sourceList.Count); for (int i = 0; i < count; i++) { if (i >= sourceList.Count) //现有列表大于新增列表 { //删除节点 srlogic.Contents[i].Destroy(); } else if (i >= srlogic.Contents.Count) //新增模式 { var sourceProp = sourceList[i] as PropsBase; //创建component实例 var com = Activator.CreateInstance(sourceProp.ComponentType) as IComponent; if (com != null) { if (com.IsLoad) //同步加载 { //添加组件 srlogic.AddItem(com); //更新组件 com.SetProps(sourceProp); } } else { BDebug.LogError("【类型出错】该类型不是组件:" + sourceProp.ComponentType); } } else //更新模式 { //TODO 这里更新模式一般不这么强制更新, //最好自己做算法索引,动态调整item的位置, //不要每个重新设置 var source = sourceList[i] as PropsBase; var com = srlogic.GetItem(i); com.SetProps(source); } } //移除无效component srlogic.RemoveUnInvalidComponent(); }
/// <summary> /// ScrollView的Content /// </summary> /// <param name="value">value必须是ComponentList 类型 </param> private void SetProp_Contents(Transform trans, object value) { ScrollRectAdaptor scrollRectAdaptor = null; if (!srlogicMap.TryGetValue(trans, out scrollRectAdaptor)) { var sr = trans.GetComponent <ScrollRect>(); scrollRectAdaptor = new ScrollRectAdaptor(sr); srlogicMap[trans] = scrollRectAdaptor; } //这里用协变能保证一定转型成功 var propsList = value as IPropsList; /**********************增***********************/ var list = propsList.GetNewDatas(); foreach (var props in list) { //创建component实例 var com = Activator.CreateInstance(props.ComponentType) as IComponent; if (com != null) { if (com.IsLoad) //同步加载 { //添加组件 scrollRectAdaptor.AddItem(props, com); //更新组件 com.SetProps(props); } } else { BDebug.LogError("【类型出错】该类型不是组件:" + props.ComponentType); } } /**********************改***********************/ list = propsList.GetChangedDatas(); foreach (var props in list) { //刷新节点 var com = scrollRectAdaptor.GetItem(props); com.SetProps(props); } /**********************删***********************/ list = propsList.GetRemovedDatas(); foreach (var props in list) { //删除节点 scrollRectAdaptor.Destroy(props); } }