Как сохранить OnItemSelected от запуска только что созданного Spinner?

Я добавил код, представленный jSnake04 и Dasun. Я добавил код для создания списков объектов из экземпляров JArray. Он имеет двухстороннюю рекурсию, но поскольку он функционирует на фиксированной конечной модели дерева, нет риска переполнения стека, если данные не массивны.

/// <summary>
/// Deserialize the given JSON string data (<paramref name="data"/>) into a
///   dictionary.
/// </summary>
/// <param name="data">JSON string.</param>
/// <returns>Deserialized dictionary.</returns>
private IDictionary<string, object> DeserializeData(string data)
{
    var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(data);

    return DeserializeData(values);
}

/// <summary>
/// Deserialize the given JSON object (<paramref name="data"/>) into a dictionary.
/// </summary>
/// <param name="data">JSON object.</param>
/// <returns>Deserialized dictionary.</returns>
private IDictionary<string, object> DeserializeData(JObject data)
{
    var dict = data.ToObject<Dictionary<String, Object>>();

    return DeserializeData(dict);
}

/// <summary>
/// Deserialize any elements of the given data dictionary (<paramref name="data"/>) 
///   that are JSON object or JSON arrays into dictionaries or lists respectively.
/// </summary>
/// <param name="data">Data dictionary.</param>
/// <returns>Deserialized dictionary.</returns>
private IDictionary<string, object> DeserializeData(IDictionary<string, object> data)
{
    foreach (var key in data.Keys.ToArray()) 
    {
        var value = data[key];

        if (value is JObject)
            data[key] = DeserializeData(value as JObject);

        if (value is JArray)
            data[key] = DeserializeData(value as JArray);
    }

    return data;
}

/// <summary>
/// Deserialize the given JSON array (<paramref name="data"/>) into a list.
/// </summary>
/// <param name="data">Data dictionary.</param>
/// <returns>Deserialized list.</returns>
private IList<Object> DeserializeData(JArray data)
{
    var list = data.ToObject<List<Object>>();

    for (int i = 0; i < list.Count; i++)
    {
        var value = list[i];

        if (value is JObject)
            list[i] = DeserializeData(value as JObject);

        if (value is JArray)
            list[i] = DeserializeData(value as JArray);
    }

    return list;
}
399
задан CaptJak 15 May 2016 в 21:48
поделиться

3 ответа

Я ожидал, что ваше решение сработает - хотя событие выбора не сработает, если вы установите адаптер до настройки слушателя.

При этом простой логический флаг позволит вам обнаружить случайное событие первого выбора и проигнорировать его.

75
ответ дан 22 November 2019 в 23:35
поделиться

Обращаясь к ответу Дэна Дайера, попробуйте зарегистрировать OnSelectListener в методе post(Runnable):

spinner.post(new Runnable() {
    public void run() {
        spinner.setOnItemSelectedListener(listener);
    }
});

Сделав это для меня, желаемое поведение, наконец, произошло.

В этом случае это также означает, что слушатель запускает только измененный предмет.

189
ответ дан Richard Le Mesurier 15 May 2016 в 21:48
поделиться

Я бы попытался вызвать

spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

после того, как вы вызовете setAdapter (). Также попробуйте позвонить до адаптера.

У вас всегда есть решение пойти с подклассом, где вы можете обернуть логический флаг в свой переопределенный метод setAdapter, чтобы пропустить событие.

0
ответ дан 22 November 2019 в 23:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: