Установка выбранного пункта в ListBox без цикличного выполнения

Давайте назовем ваш объект сущностей entities-module. Этот проект содержит POJO классов с аннотациями JAXB, такими как: @XmlElement, @XmlType и т. Д. Поскольку, как вы написали, « JAXB« устарел »на Android », вам необходимо выберите между: прочитайте JAXB аннотации другими инструментами или создайте новую настроенную POJO структуру.

Считайте аннотации JAXB другими инструментами. Библиотека

Jackson хорошо поддерживает аннотации JAXB. Все, что вам нужно сделать, это использовать модуль jackson-module-jaxb-annotations . Его легко зарегистрировать, и если вы уже используете Jackson для сериализации / десериализации JSON, это очевидный выбор. Как это сделать, вы можете найти ответы на этот вопрос в SO: Использование JAXB с Google Android .
Плюсы:

  • Вам не нужно создавать новую схему POJO.
  • В случае изменений в Restful API вы используете следующую версию проекта entities-module.

Минусы:

  • Проблемы с включением JAXB на Android.
  • Проблемы производительности, связанные с использованием тяжелых уровней модулей JAXB и Jackson.

Новый модуль

Второй вариант - создать новый модуль с POJO с и использовать более быструю и меньшую библиотеку, такую ​​как SimpleXML .
Плюсы:

  • Лучшая производительность
  • Нет проблем со сборкой приложения с устаревшими JAXB классами.
  • Вы можете оптимизировать структуру: игнорировать неиспользуемые поля, выбирать лучшие типы и т. Д.

Минусы:

  • Вам необходимо создать новый модуль с новой структурой классов.
  • Изучение и поддержка новой библиотеки
  • В случае изменений в API вам необходимо продублировать изменения в нескольких модулях.

Вам нужно взглянуть на вышеприведенный список pros and cons и решить, что лучше для вас.

Я также хотел бы добавить еще две опции:

  1. Заменить JAXB аннотации на Jackson аннотации. Jackson имеет действительно хорошую поддержку XML, кроме отличной для JSON. Это позволит вам легко поддерживать форматы JSON и XML в вашем API. Также вы можете использовать библиотеку Jackson в Android.
  2. Создать новое JSON API для Android приложения. В большинстве случаев потоки UI в приложении Android отличаются от приложений Web App, и, возможно, вы все равно придете к этой идее.

8
задан Rashmi Pandit 10 June 2009 в 06:21
поделиться

4 ответа

Хорошо ... вот и трудный для переваривания ответ, который я понял только вчера. Это моя ошибка, хотя я не упомянул одну важную вещь в моем вопросе, потому что я чувствовал, что это не имеет отношения к рассматриваемой проблеме:

Данные в таблице данных не были отсортированы. Поэтому я установил для свойства Sorted списка значение true . Позже я понял, что когда свойство сортировки списка или даже поля со списком имеет значение true, то член значения не устанавливается должным образом. Поэтому, если я напишу:

lb.SelectedValue = valuePassedByUser;

, он устанавливает какой-то другой элемент как выбранный, а не устанавливает тот, значение которого равно valuePassedByUser. Короче это портит индексы.

Например, если мои исходные данные:

Index   ValueMember DisplayMember
1          A            Apple
2          M            Mango
3          O            Orange
4          B            Banana

И я установил sorted = true. Затем элементы списка:

Index   ValueMember DisplayMember
1          A            Apple
2          B            Banana
3          M            Mango
4          O            Orange

Теперь, если я хочу установить Banana как выбранный, я запускаю stmt:

lb.SelectedValue = "B";

Но вместо того, чтобы установить «Банан» как выбранный, он устанавливает «Оранжевый» как выбранный. Почему? Поскольку, если бы список не был отсортирован, индекс банана был бы равен 4. Таким образом, даже если после сортировки индекса банана значение 2, он устанавливает индекс 4 как выбранный, тем самым делая выбранным апельсин вместо банана.

Следовательно, для отсортированного списка я использую следующий код для установки выбранных элементов:

private void SetSelectedBreakType(ListBox lb, string value)
{
    for (int i = 0; i < lb.Items.Count; i++)
    {
        DataRowView dr = lb.Items[i] as DataRowView;
        if (dr["value"].ToString() == value)
        {
            lb.SelectedIndices.Add(i);
            break;
        }
    }
}
7
ответ дан 5 December 2019 в 20:18
поделиться

Я думаю, что единственный способ выбрать несколько элементов - это использовать цикл foreach. Кажется, что свойство SelectedValue возвращает только 1 элемент. Если вы хотите выбрать более одного элемента, вам придется использовать:

var tempListBox = c As ListBox;
if (tempListBox != null)
     (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]);

Также FindStringExact не выполняет поиск по полям значений, а только просматривает отображаемый текст. Кроме того, для сокращения кода может потребоваться преобразование новой переменной в список, чтобы вы не преобразовывали C в список.

1
ответ дан 5 December 2019 в 20:18
поделиться

Try this:-

 var listBox = c as ListBox;
    var item = listBox.Items.FindByValue(fieldValue);
    if (item != null)
     listBox.SelectedValue = fieldValue;
0
ответ дан 5 December 2019 в 20:18
поделиться

Вы можете использовать "FindByValue" следующим образом:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue))
0
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

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