Что такое dataset базового адаптера

#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.