В таблице Юникода есть несколько невидимых символов, часть из которых имеют нулевую ширину. Это позволяет в случае с Thunkable X решить одну, возможно, несколько надуманную проблему, связанную с использованием компонента ListViewer на Android.
В Thunkable X в опциях компонента List Viewer может отобразить только однострочные текстовые строки. Как правило, данные в List Viewer добавляются из списка объектов. Например, в таблице AirTable хранятся записи, а в приложении необходимо осуществить их поиск и фильтрацию. Язык запросов здесь отсутствует, и общий алгоритм реализуется так: сначала все данные из AirTable сохраняются в списке объектов, а затем значения выбранного поля или нескольких полей выводятся в List Viewer. Если индексы в исходном списке объектов совпадают с индексами полей данных List Viewer, или значения полей являются уникальными, то получить данные из списка объектов не представляет сложности. В обработчик события выбора List Viewer передаются два параметра - индекс и значение выбранной опции. Если используется сортировка, а значения полей неуникальны, то в этом случае сортировка значений производится во временный список с последующим их копированием в List Viewer, что позволит синхронизировать индексы. Каждая опция временного списка должна содержать значение поля и его индекс в исходном списке объектов для доступа к другим полям объекта. В результате получается следующая структура:
Исходный список объектов sourceList:
[1] {name - Петя, age - 18}
[2] {name - Вася, age - 8}
[3] {name - Роза, age - 26}
[4] {name - Вася, age - 16}
Временный список tmpList, отсортированный по именам:
Вася [2]
Вася [4]
Петя [1]
Роза [3]
Данные, отображающиеся в ListViewer:
Вася
Вася
Петя
Роза
При выборе второй опции Вася в List Viewer получим индекс 1. По этому индексу находим запись во временном массиве Вася [4] (tmpList[1]), а затем, и возраст выбранного человека 16 (sourceList[4].age).
Из-за неустранённого бага индексации списков в Thunkable X, показанный алгоритм может дать сбой (индексация начнётся с 0, а не с 1, как должно быть), например, в обработчике события List Viewer получаем правильный индекс, а временный массив из-за сбоя возвратил неверную запись. Можно, конечно, включить коррекцию ошибок, но в образовательных целях мы выберем другой путь - сохранять индексы исходного списка непосредственно в List Viewer, что позволит убрать из цепочки получения данных временный список. Для простоты индекс можно выводить в List Viewer перед данными, например, так:
[2] Вася
[4] Вася
[1] Петя
[3] Роза
При выборе опции в List Viewer выделяем из её значения индекс. Но всё будет выглядеть лучше, если в List Viewer не будет отображаться индекс. В iOS данные и индекс объединяются через символ перевода строки \n, в результате чего значение индекса не будет отображаться в списке. Но в Android это не работает и на помощь приходят невидимые символы Юникода. Количества этих символов недостаточно для десятичного представления индексов. Придётся использовать двоичное кодирование. Для этого воспользуемся невидимыми символами умножения, сложения и разделителя.
В ходе сортировки индексы кодируются в двоичный формат:
Вася#0010
Вася#0100
Петя#0001
Роза#0011
Затем символы #, 0 и 1 заменяются на соответствующие невидимые символы и записываются в List Viewer. При выборе опции из списка происходит обратное преобразование.
Подобным образом можно кодировать и символы, но в случае использования Thunkable X, придётся вручную создать таблицу соответствий кодов и символов.
Блоков для работы с двоичным кодом в Thunkable X нет и можно предложить учащимся реализовать их самостоятельно в виде функций.