Жизненный цикл вызовов при использовании SimpleCursorAdapter.setViewImage - PullRequest
0 голосов
/ 02 апреля 2012

ОК, пытаюсь получить изображения с моей SD-карты для показа в активности ListView.

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

Из моих исследований звучит так, будто bindview() вызывается при выполнении listview.setadapter(SimpleCursorAdapter adapter). В документации говорится, что setImageView вызывается bindview, если ViewBinder не может обработать ImageView.

Вы указываете поле в массиве FROM, id TextView в массиве TO, Cursor и группу представлений с помощью TextView. Затем установите адаптер на ListView и вуаля, это происходит.

Я думаю, что последовательность вызова тогда: listView.setAdapter(SimpleCursorAdapter adapter)->adapter.bindView()->adapter.setTextView

Bindview должен определить, что представление имеет тип TextView, determine that it can bind it, passes the TextView and text value from the cursor and setTextView` делает свое дело.

Итак, это делает вызов для ImageView очень похожим, верно?

listViw.setAdapter(SimpleCursorAdapter adapter)->adapter.bindView()->adapter.setImageView

Итак, когда bindView сталкивается с объектом типа ImageView, что он делает? Есть ли реализация по умолчанию, как в setTextView? Я предполагаю, что это будет трудно сделать, изображения сильно различаются. Текст - это текст, но изображения имеют форматы, размеры, глубину, масштаб, расположение и т. Д. И т. Д. Строка, переданная в setTextView, представляет собой текст, полезную нагрузку. На изображении строка (вероятно) - имя файла, только начальная точка изображения.

Я думаю, мне нужно собрать свой адаптер с именем столбца базы данных, которое содержит имя файла в FROM. Массив TO будет иметь только идентификатор ImageView в моем макете. Я думаю, что могу использовать видоискатель по умолчанию bindview () , но мне придется переопределить setImageView(), чтобы взять ожидаемую строку (имя файла), и построить строки загрузки изображения, чтобы найти это имя изображения в ожидаемом путь к приложению.

Так что будет (может быть):

listView.setAdapter(MyOwnSimpleCursorAdapter myOwnAdapter)->myOwnAdapter.super.bindView()->myOwnAdapter.setImageView()

Это звучит правильно? Если кто-нибудь сможет заполнить пропущенные пробелы и / или предоставить какой-нибудь рабочий исходный код, это очень поможет. Кстати, я написал код для этого, но он не работает. Это может быть очень простой ошибкой, и она не хочет останавливать этот поток, если это выполнимо. Я думаю, мне просто нужно немного подтолкнуть в правильном направлении.

1 Ответ

4 голосов
/ 02 апреля 2012

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

В SimpleCursorAdapter, когда ListView требует отображения нового View, будет вызван метод getView(). Этот метод делегирует построение строки двум методам: newView() (что создаст View (накачка макета xml, который вы установили) и установите в качестве тега массив View s с ids из массив to) и bindView() (который фактически свяжет данные с View, созданным newView()).

bindView() будет выполнять итерацию по массивам View с (View с с id с из массива to), для которых необходимо связать данные. Он также вызовет getString (и только метод getString, это важно) из курсора, чтобы получить данные. Затем метод проверяет, был ли установлен ViewBinder на адаптере, если это так, он позволит ViewBinder установить данные (методы setTextView() и setImageView() не будут вызваны, если ViewBinder успешно связывает данные).

Если на адаптере не был установлен ViewBinder или метод setViewValue ViewBinder возвращает false (что означает, что ViewBinder не удалось), то метод bindView() проверит и увидит, какой тип View, с которым он имеет дело (TextView или ImageView), и вызовите либо setViewText(), либо setViewImage().

Реализация setViewImage() попытается проанализировать предоставленную строку как int (пример: идентификатор изображения R.drawable.image), и если это не удастся, то она будет анализировать String как Uri и используйте setImageUri() на ImageView. Таким образом, int как R.drawable.image или String как "file://mnt/sdcard/photo100.jpg" должны работать с реализацией SimpleCursorAdapter по умолчанию, в противном случае переопределить setImageView.

...