Android для начинающих: адаптер для простого просмотра или прямого запроса к БД?

Во-первых, я действительно новичок в Android (‹ 4 дня).

Я пытаюсь понять, как данные базы данных связаны с представлениями и виджетами.

Я сделал несколько руководств и заметил, что адаптеры используются для связывания адаптерных представлений, которые (как я понимаю) являются представлениями, которые содержат кучу идентичных подвидов (например, списки, галереи и т. д.). Таким образом, адаптер отвечает за создание этих подпредставлений и заполнение данных для каждого из них (поправьте меня, если я ошибаюсь).

Теперь предположим, что у меня есть представление списка, в котором, например, перечислены отели. Каждая строка в списке содержит название отеля и базовую оценку (например, 5 звезд). Теперь, когда вы нажимаете на отель в списке, появляется новое действие с подробной информацией об этом конкретном отеле. Все данные находятся в базе данных. Я понимаю, что у вас есть адаптер, управляющий ссылкой data‹->view для списка, но как лучше всего управлять данными для просмотра сведений об отеле (это не список, а просто пара текстовых представлений и изображение для пример)?

Лучше всего просто передать идентификатор в намерении, а затем сделать так, чтобы действие деталей извлекало данные из БД самостоятельно (в этом случае я сохраняю запрос в действии сведений?)? Или вы получаете все поля, которые вам нужны, и помещаете их напрямую в намерение? Вам нужен адаптер для представления, которое на самом деле не генерирует множество похожих подпредставлений?

Я предполагаю, что краткое изложение моего вопроса заключается в том, что вы используете вместо адаптера, когда имеете дело не с адаптерами, а просто с простыми одиночными представлениями.

Спасибо за любую помощь, которую вы можете предоставить.


person nebs    schedule 08.09.2010    source источник
comment
Отличный вопрос и отлично заданный - у меня такая же дилемма.   -  person Joshua Pinter    schedule 11.01.2014


Ответы (2)


Лучше всего просто передать идентификатор в намерении, а затем сделать так, чтобы действие деталей извлекало данные из БД самостоятельно (в этом случае я сохраняю запрос в действии сведений?)?

Это то, что я бы порекомендовал.

Вам нужен адаптер для представления, которое на самом деле не генерирует множество похожих подпредставлений?

Нет. Вы используете только Adapter с AdapterView (ListView, Spinner и т. д.)

Я предполагаю, что краткое изложение моего вопроса заключается в том, что вы используете вместо адаптера, когда имеете дело не с адаптерами, а просто с простыми одиночными представлениями.

Просто Cursor из базы данных. Получите поля из (одной) строки в Cursor, поместите их в виджеты EditText и, когда пользователь внесет изменения, обновите строку.

person CommonsWare    schedule 08.09.2010
comment
Имеет смысл для меня. Спасибо за простой ответ. - person nebs; 08.09.2010

@CommonsWare на высоте. В качестве примера кода я смог высушить вещи, создав вспомогательный метод для динамической настройки TextViews немного чище.

В моем onCreate() у меня есть ряд следующих строк:

bindTextView(hotel, "uid");   // `hotel` is the Hotel object with attributes.

Затем я определяю bindTextView() ниже следующим образом:

protected void bindTextView( Hotel hotel, String attribute ) {

    try {

        // Get field for object dynamically.
        Field field = hotel.getClass().getField(attribute); 

        // Invoke field "getter" method to get value.
        String value = field.get(hotel).toString();                                                                   

        // Get resource id dynamically.
        int resourceId = R.id.class.getField(attribute).getInt(null);                                               

        // Get element with resource id.
        TextView element = (TextView) this.findViewById( resourceId );                                              

        // Finally, set the element's text value.
        element.setText( value );

    } catch (IllegalAccessException e) { e.printStackTrace();                                                       

    } catch (NoSuchFieldException e)   { e.printStackTrace(); }                                                     

}

На самом деле я переместил этот вспомогательный метод в базовый класс Activity, так как он используется несколькими различными действиями.

Я надеюсь, что это поможет некоторым людям поддерживать чистоту своей деятельности.

JP

person Joshua Pinter    schedule 12.01.2014