#android
#Android
Вопрос:
Когда мы используем ArrayAdapter, мы передаем что-то вроде списка в суперкласс. Но конструктор базового адаптера не имеет никаких параметров. Как этот класс находит набор данных? Я видел в некоторых примерах, что они просто определяют массив и переопределяют функции, не указывая список в качестве набора данных. Итак, как класс понимает, что это dataset? Что, если мы определим более одного списка в производном классе?
Редактировать: я думаю, мне следует прояснить свой вопрос. Когда мы используем ArrayAdapter, набор данных указан, и программа знает, что нужно повторить, и вызывает getView для каждого из них. Но в базовом адаптере мы определяем только список и переопределяем 4 функции, и это работает! Мой вопрос в том, почему это работает ?! мы не указывали dataset, мы просто указываем тело getView, и оно возвращает представление. Я не понимаю, как программа находит dataset.
Ответ №1:
Поскольку документация хорошо объясняет это :
Общий базовый класс общей реализации для адаптера
Означает, что вы должны выполнить реализацию.
http://developer.android.com/reference/android/widget/BaseAdapter.html
Комментарии:
1. Я уже прочитал это. Единственное, что я реализую, это getView(). И getview вызывается для каждого элемента списка. Мой вопрос заключается в этом списке. Мы не указали его как DataSet, так как AdapterView рассматривает его как dataset, а затем вызывает для него getView?
2. Вы должны определить его, когда расширяете класс, так же, как некоторые переменные для этого класса, и изменить метод onCreate, создать свой собственный сеттер для данных, реализовать остальное.
3. 1. Список объектов определен в производном классе. 2. Реализован getView и несколько других функций. 3. Готово, getView вызывается для всех элементов списка… Где мы указали, что это за dataset? можете ли вы показать мне пример, в котором указан dataset для AdapterView или BaseClass?
4. Я думаю, что эта страница подводит итог всему: androidadapternotifiydatasetchanged.blogspot.fr Вы должны определить getItemViewType(int position) и getViewTypeCount(), они будут вызваны адаптером для создания нового представления (своего рода цикл для всех позиций от 0 до getViewTypeCount, если я прав)
Ответ №2:
Как этот класс находит набор данных?
Это не так. Ваш подкласс BaseAdapter
управляет набором данных.
Что, если мы определим более одного списка в производном классе?
До тех пор, пока вы правильно реализуете abstract
Adapter
методы ( getCount()
, getView()
getItem()
, getItemId()
, ,, …), то, как вы управляете своими собственными данными, зависит от вас.
Комментарии:
1. В ArrayAdapter для каждого из элементов списка вызывается getView. То же самое относится и к BaseAdapter. Но как? Мы не передаем список в суперкласс в Baseadapter. В примерах, которые я видел, были только функция getView и список. Не было ничего похожего на цикл для вызова getView для каждого из них. Что вызывает getView и для какого набора данных?
2. @user2808671: «То, что вызывает getView» — то,
AdapterView
которое используетAdapter
, напримерListView
. «для какого набора данных?» — все, что вы хотите.ArrayAdapter
адаптирует массивы.CursorAdapter
адаптируетсяCursors
. Однажды я написал,JSONAdapter
который адаптировалJSONArray
. И так далее. Разработчик подклассаBaseAdapter
должен определить, что это за набор данных и как выполнитьAdapter
контракт.3. Ну, только определение списка с некоторыми переменными и возврат TextView в getView() body выполняет свою работу! В getView() Я пишу только TextView.setText(список [позиция]). Но для чего AdapterView вызывает getView? Вы говорите, что мы сами определяем? Я не нахожу строки кода для определения этого. Но программа работает. Существует только список и функция getView, а AdapterView вызывает getView для всего списка. Я спрашиваю, как adapter view знает, для какого списка вызывать getView?
4. @user2808671: «Но для чего AdapterView вызывает getView?» — чтобы вывести представления на экран.
ListView
Например, используетgetView()
для извлечения строк списка.5. Исходя из этого вопроса, я имел в виду «Для какого списка» представление адаптера вызывает функцию getView? Я этого не понимаю, я не нахожу ни в одном примере фрагмента кода, который указывал бы dataset в baseclass. Я вижу только, что AdapterView вызывает getView для списка, который используется в getView(). Любой список, используемый в getView, повторяется и рассматривается как DataSet.
Ответ №3:
Что ж, после дополнительных соображений по кодам я думаю, что именно так работает базовый адаптер:
Он зацикливает функцию getView() с параметром ‘position’ на значение от 0 до значения, возвращаемого getCount(). мы должны переопределить getCount() и отправить правильный индекс последнего элемента DataSet. Каждый раз, когда вызывается getView(), мы можем работать с представлениями и любым списком, который мы хотим, в соответствии с текущей позицией. И я думаю, что основное различие между ArrayAdapter и BaseAdapter заключается в том, что ArrayAdapter находит последний индекс списка, когда мы передаем его в суперкласс, но в базовом адаптере мы должны определить последний индекс. Реализация getView() такая же, и мы можем использовать любой список, который мы хотим в getView. Хитрость заключалась только в параметре position.