Titanium Alloy - 更改动态生成的 ListView 元素的属性
Titanium Alloy - Change properties of dynamically generated ListView elements
我正在与 Appcelerator 合作,并且正在开发一项消息传递功能,这是我从我们公司的移动应用程序的前任员工那里获得的。我被要求集成消息删除功能,我采取了添加菜单并允许用户在消息 select 模式和阅读模式之间切换的方式。我在每个消息模板中放置了一个复选框样式开关,并试图在用户从菜单中单击 "Select" 时将开关元素的可见性更改为 true。因为这些元素是动态生成的,所以我不能直接通过id访问这些元素,因为有很多相同的id。我已经广泛寻找解决方案,特别是因为 Titanium 社区非常小。有人知道可能的解决方案吗?
这是我的 XML:
<Alloy>
<Window id='window' >
<Menu id="menu" platform="android">
<MenuItem id="menuItem1" title="Select" onClick="toggleSelect"/>
<MenuItem id="menuItem2" title="Delete All" onClick="clearMessages"/>
</Menu>
<View id="ParentViewContainer">
<ScrollView id="ParentScrollView" layout="vertical">
<ListView backgroundColor="transparent" id="messageList">
<Templates>
<ItemTemplate name="sentTemplate" id="sentTemplate">
<View class="containerView">
<View id="sentTemplateView">
<Switch id="sentSelectSwitch" class="selectSwitch" bindId="sentSelectSwitch" visible="false" value="false" onChange="toggleChecked"/>
<Label bindId="message" id="message"/>
</View>
</View>
</ItemTemplate>
<ItemTemplate name="recievedTemplate" id="recievedTemplate">
<View class="containerView">
<View id="recievedTemplateView">
<Switch id="recSelectSwitch" class="selectSwitch" bindId="recSelectSwitch" visible="false" value="false" onChange="toggleChecked"/>
<Label bindId="message" id="message"/>
</View>
</View>
</ItemTemplate>
</Templates>
<ListSection id="listSection">
</ListSection>
</ListView>
<View id="sndView">
<TextArea id="sndTxt"/>
<Button id="sndBtn"/>
</View>
</ScrollView>
</View>
我会为您的列表创建单独的模板,一个带有可见的复选框,一个不可见。当他们 "go into select mode" 时,您将分配 checkbox-visible 模板。然后,我会在列表中使用 itemclick
事件,并将项目的唯一 ID 推送到数组或其他结构中,然后您稍后会在用户点击“提交”按钮后实际删除这些结构。
ListView UI 元素的目的是减少 JS 和本机代码之间 Kroll Bridge 的使用,因此遍历所有行并调用 updateItemAt
似乎是错误的方法。
我不确定您绘制了多少项,但根据菜单的实现方式,我建议重新创建具有正确 UI(可见或不可见)的列表项可能会更好解决方案。
附带说明一下,在操作列表和滚动视图时遇到相同 ID 的挑战是很常见的,动态唯一 ID 的解决方案如下所示:
var itemCount = 1;
_.each(dataModelObjects, function (_obj) {
$['wrapper' + itemCount] = $.UI.create('View', { id: 'someIdInTSS'});
itemCount++;
});
我正在与 Appcelerator 合作,并且正在开发一项消息传递功能,这是我从我们公司的移动应用程序的前任员工那里获得的。我被要求集成消息删除功能,我采取了添加菜单并允许用户在消息 select 模式和阅读模式之间切换的方式。我在每个消息模板中放置了一个复选框样式开关,并试图在用户从菜单中单击 "Select" 时将开关元素的可见性更改为 true。因为这些元素是动态生成的,所以我不能直接通过id访问这些元素,因为有很多相同的id。我已经广泛寻找解决方案,特别是因为 Titanium 社区非常小。有人知道可能的解决方案吗?
这是我的 XML:
<Alloy>
<Window id='window' >
<Menu id="menu" platform="android">
<MenuItem id="menuItem1" title="Select" onClick="toggleSelect"/>
<MenuItem id="menuItem2" title="Delete All" onClick="clearMessages"/>
</Menu>
<View id="ParentViewContainer">
<ScrollView id="ParentScrollView" layout="vertical">
<ListView backgroundColor="transparent" id="messageList">
<Templates>
<ItemTemplate name="sentTemplate" id="sentTemplate">
<View class="containerView">
<View id="sentTemplateView">
<Switch id="sentSelectSwitch" class="selectSwitch" bindId="sentSelectSwitch" visible="false" value="false" onChange="toggleChecked"/>
<Label bindId="message" id="message"/>
</View>
</View>
</ItemTemplate>
<ItemTemplate name="recievedTemplate" id="recievedTemplate">
<View class="containerView">
<View id="recievedTemplateView">
<Switch id="recSelectSwitch" class="selectSwitch" bindId="recSelectSwitch" visible="false" value="false" onChange="toggleChecked"/>
<Label bindId="message" id="message"/>
</View>
</View>
</ItemTemplate>
</Templates>
<ListSection id="listSection">
</ListSection>
</ListView>
<View id="sndView">
<TextArea id="sndTxt"/>
<Button id="sndBtn"/>
</View>
</ScrollView>
</View>
我会为您的列表创建单独的模板,一个带有可见的复选框,一个不可见。当他们 "go into select mode" 时,您将分配 checkbox-visible 模板。然后,我会在列表中使用 itemclick
事件,并将项目的唯一 ID 推送到数组或其他结构中,然后您稍后会在用户点击“提交”按钮后实际删除这些结构。
ListView UI 元素的目的是减少 JS 和本机代码之间 Kroll Bridge 的使用,因此遍历所有行并调用 updateItemAt
似乎是错误的方法。
我不确定您绘制了多少项,但根据菜单的实现方式,我建议重新创建具有正确 UI(可见或不可见)的列表项可能会更好解决方案。
附带说明一下,在操作列表和滚动视图时遇到相同 ID 的挑战是很常见的,动态唯一 ID 的解决方案如下所示:
var itemCount = 1;
_.each(dataModelObjects, function (_obj) {
$['wrapper' + itemCount] = $.UI.create('View', { id: 'someIdInTSS'});
itemCount++;
});