Элементы в списке никогда не выбираются
У меня есть список, и установка списка на точный элемент, который находится в его dataProvider, не будет выбирать его программно. Вот код:
if (list.selectedItem != iDocument) {
var length:int = documentsCollection.length;
for (var i:int;i<length;i++) {
jDocument = IDocumentData(documentsCollection.getItemAt(i));
if (jDocument.uid==iDocument.uid) {
list.selectedItem = IDocumentData(documentsCollection.getItemAt(i));
break;
}
}
}
1 ответ
Были две проблемы.
Я применил сортировку к ArrayCollection, и поле не было в элементе. Я скопировал код из другого проекта, и поле было "@name", так как это была коллекция XMLListCollection. Поле сортировки должно было быть установлено на "имя".
Таким образом, когда вы устанавливаете свойство selectedItem, оно просматривает коллекцию, и если коллекция имеет сортировку, то она ищет в вызове findItem(), который выполняет функцию сравнения, которая проверяет, есть ли у элемента имя поля в элементе. Если нет, выдает ошибку. Так как у меня было неправильное имя поля, была выдана ошибка. Если выдается ошибка, то стремление найти выбранный элемент прекращается, а выбранный индекс равен -1.
Код из ListCollectionView.as:
try
{
return sort.findItem(localIndex, values, mode, insertIndex);
}
catch (e:SortError)
{
// usually because the find critieria is not compatible with the sort.
}
return -1;
Код из Sort.as:
var hasFieldName:Boolean;
try
{
hasFieldName = values[fieldName] !== undefined;
}
catch(e:Error)
{
hasFieldName = false;
}
if (hasFieldName)
{
if (!hadPreviousFieldName)
{
message = resourceManager.getString(
"collections", "findCondition", [ fieldName ]);
throw new SortError(message);
}
else
{
fieldsForCompare.push(fieldName);
}
}
Вторая проблема заключалась в том, что List использует оператор точного равенства, поэтому он использует "===" вместо "==". Это означает, что вы должны убедиться, что передаете точный экземпляр элемента в списке.