我在Tiatnium应用程序中使用选择器。
Picker数据从json响应加载。我首先在临时数组中存储API数据,然后将数据添加到选择器。
问题是,当我第一次点击选择元素时,更改事件不会被触发。 完成第一次点击后,如果我点击它按预期工作的任何元素。
以下是它的小代码片段
letters=['A', 'I', 'R']
[letters[start:end+1]
for start in xrange(len(letters))
for end in xrange(start, len(letters))]
[['A'], ['A', 'I'], ['A', 'I', 'R'], ['I'], ['I', 'R'], ['R']]
那么问题是什么。
任何人都可以解释一下吗?
答案 0 :(得分:0)
以下示例正常工作:
<强> INDEX.XML 强>
var picker = Titanium.UI.createPicker();
var data = [];
data[0]=Ti.UI.createPickerRow({title:'Bananas'});
data[1]=Ti.UI.createPickerRow({title:'Strawberries'});
data[2]=Ti.UI.createPickerRow({title:'Mangos'});
data[3]=Ti.UI.createPickerRow({title:'Grapes'});
picker.add(data);
picker.addEventListener('change', function(e) {
console.log(e.row.title);
});
$.mainWindow.add(picker);
$.mainWindow.open();
<强> index.js 强>
RequestDispatcher rd = request.getRequestDispatcher("load_plan");
rd.forward(request, response);
//or rd.include(request, response);
每次(也是第一次)我点击选取器的一行时,我都会在控制台上获得正确的日志。在Titanium 4.1.0,iOS 8.4上测试
选择器工作正常。我猜您的代码中还有其他问题(您没有向我们展示过这些内容)。
如果此示例不适合您,请告诉我
答案 1 :(得分:0)
这是我第一次回答自己的问题。 对于那些第一次点击选择器有问题的人来说,这可能对你有帮助。
以下是您可能遇到问题的代码。
<Alloy>
<Window id="winpast" class="container" title="Past issues" onOpen="openpastIssues">
<View id="view2" width="Ti.UI.FILL" height="Ti.UI.FILL" backgroundColor="#A9F5A9" >
<View id="viewcheck1" >
<Label id="title" width="Ti.UI.SIZE" text="Past Issues" height="Ti.UI.SIZE" textAlign="Ti.UI.TEXT_ALIGNMENT_CENTER"></Label>
<ImageView id="menuImg" image="/images/menu.png" onClick="showsideBar" left="5"></ImageView>
<Picker id="picker" selectionIndicator="true" height="Ti.UI.SIZE" width="Ti.UI.SIZE" right="10">
</Picker>
</View>
</View>
</Window>
js file
for (var i = sorted.length - 1; i >= 0; i--) {
pickerData[i] = Ti.UI.createPickerRow({
title : sorted[i],
});
$.picker.add(pickerData);//picker is added in xml file and data is added now
picker.addEventListener('change', function(e) {
alert(e.row.title);
});
$.winpast.open();
上述代码段可能会在选择器首次点击时出现问题。
现在这是我使用@Riccardo Bucco的建议实现删除此问题的正确方法
我只是根据他的建议进行了试验并发现了这一点。
这是正确的代码。
<Alloy>
<Window id="winpast" class="container" title="Past issues" onOpen="openpastIssues">
<View id="view2" width="Ti.UI.FILL" height="Ti.UI.FILL" backgroundColor="#A9F5A9" >
<View id="viewcheck1" >
<Label id="title" width="Ti.UI.SIZE" text="Past Issues" height="Ti.UI.SIZE" textAlign="Ti.UI.TEXT_ALIGNMENT_CENTER"></Label>
<ImageView id="menuImg" image="/images/menu.png" onClick="showsideBar" left="5"></ImageView>
</View>
</View>
</Window>
js file
var picker = Ti.UI.createPicker({
right:10
});
for (var i = sorted.length - 1; i >= 0; i--) {
pickerData[i] = Ti.UI.createPickerRow({
title : sorted[i],
});
Ti.API.info('From sorted ' + i + sorted[i]);
}
picker.add(pickerData);//we add data here and picker is not added yet
$.viewcheck1.add(picker);//after adding whole data we are adding picker in the view so it resolves the first click issue.
$.winpast.open();
第二种方式适用于我,并且没有选择器的第一次点击问题。如果我的答案中的任何内容都没有被正确提及那么请纠正我。
希望它有所帮助。
答案 2 :(得分:0)
这是回答这个问题的时间很长,但我找到了一种使用Alloy XML完成此任务的新方法。
<强> INDEX.XML 强>
<Alloy>
<Window>
<Picker id="PICKER" width='70%' height="Ti.UI.SIZE" onChange="changeValue"></Picker>
<Window>
</Alloy>
<强> index.js 强>
(function setPickerValues() {
$.PICKER.add(rows) // rows is an array of Ti.UI.PickerRows
// call these two lines to make the change event work
$.PICKER.setSelectedRow(0, 1); // this will set the picker row to the row at index 1
$.PICKER.setSelectedRow(0, 0); // now it is necessary to set row at index 0 again to make it work.
})();
function changeValue(e) {
Ti.API.info('Current Row = ' + e.rowIndex);
}
我知道这种方式有点奇怪,但是它的效果非常好,并且比在js文件中创建整个选择器所需的代码行少。