Android AdapterView?
Документы говорят:
Когда контент для вашего макета является динамическим или не предопределен, вы может использовать макет, который подклассифицирует AdapterView для заполнения макета с представлениями во время выполнения. Подкласс класса AdapterView использует Адаптер для привязки данных к его компоновке.
Но большинство учебников находятся примерно в ListView
, GridView
, Spinner
и Gallery
.
Я хочу расширить подкласс непосредственно из AdapterView
. Я должен создать собственное представление, что контент зависит от адаптера.
Как я могу это сделать и какие методы должны быть переопределены?
Ответы
Ответ 1
Во-первых, вы должны быть абсолютно уверены, что AdapterView
- это то, что вы хотите, потому что не все "динамические или не заранее определенные" представления могут быть реализованы с помощью AdapterView
. Иногда вам лучше создать свой вид, расширяющий ViewGroup
.
если вы хотите использовать AdapterView
, посмотрите этот действительно хороший пример. В GitHub есть много пользовательских представлений с адаптером. Проверьте это (extends ViewGroup
).
Ответ 2
Это может быть не полный ответ на ваш вопрос, но я покажу вам, скорее всего, отправную точку или указатель, который может вам помочь:
Учебники для разработчиков Sony - 3D ListView
Ответ 3
ListView
extends AbsListView
, который, в свою очередь, расширяет AdapterView<ListAdapter>
. Поэтому, если вы абсолютно должны реализовать такое настраиваемое представление с нуля, вы можете посмотреть исходный код этих классов:
Но будьте осторожны, это довольно сложная задача. Возможно, этого может быть достаточно, чтобы использовать один из существующих классов и настроить внешний вид.
Ответ 4
Вывод из AdapterView
может работать, но он может быть не так полезен, как вы надеетесь. Некоторая инфраструктура, предоставляемая AdapterView
, является закрытой для пакета, что означает, что у нас нет доступа к ней.
Например, AdapterView
управляет индексом выбранного элемента для AbsListView
и ListView
. Однако, поскольку такие методы, как setNextSelectedPositionInt(int position)
(который является единственным путем установки mNextSelectedPosition
), являются закрытыми пакетами, мы не можем добраться до них. AbsListView
и ListView
могут добраться до них, потому что они находятся в одном пакете, но мы не можем.
(Если вы вникнете в источник AdapterView
, вы обнаружите, что setNextSelectedPositionInt()
вызывается из handleDataChanged()
. К сожалению, handleDataChanged()
также является приватным пакетом и _not_called
из любой точки внутри AdapterView
, что может быть задействовано, чтобы включить положение настройки.)
Это означает, что если вам нужно управлять выбранной позицией, вам нужно будет воссоздать эту инфраструктуру в производном классе (или вам нужно получить от ListView
или AbsListView
... хотя я подозреваю, мы столкнемся с аналогичными проблемами, вытекающими из AbsListView
). Это также означает, что любая функциональность AdapterView
, которая вращается вокруг выбора элемента, вероятно, не будет полностью работоспособна.
Ответ 5
Вы можете создать что-то вроде этого:
public class SampleAdapter extends BaseAdapter {
public SampleAdapter() {
// Some constructor
}
public int getCount() {
return count; // Could also be a constant. This indicates the # of times the getView gets invoked.
}
public Object getItem(int position) {
return position; // Returns the position of the current item in the iteration
}
public long getItemId(int position) {
return GridView.INVALID_ROW_ID;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.some_layout, null);
view.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
view.setBackgroungColor(Color.RED);
return view;
}
}
И это можно вызвать, например:
GridView sampleView = (GridView) linearLayout.findViewById(R.id.sample_layout);
sampleView.setAdapter(new SampleAdapter());