Android AdapterView?
документы говорят:
когда содержимое для вашего макета является динамическим или не определено заранее, вы можно использовать макет, который подклассы AdapterView для заполнения макета с представлениями во время выполнения. Подкласс класса AdapterView использует Адаптер для привязки данных к макету.
но большинство учебников находятся в о ListView
,GridView
,Spinner
и Gallery
.
Я ищу, чтобы расширить подкласс непосредственно с AdapterView
. Я необходимо создать пользовательское представление, что его содержимое зависит от адаптера.
как я могу это сделать, и какие методы должны быть переопределены?
5 ответов
во-первых, вы должны быть абсолютно уверены в том, что AdapterView
Это то, что вы хотите, потому что не все "динамические или не предопределенные" представления могут быть реализованы через AdapterView
. Иногда вам лучше создать свой вид ViewGroup
.
если вы хотите использовать AdapterView
, взглянем на это очень хороший пример. Есть много пользовательских представлений с адаптером на GitHub. зацените (выходит ViewGroup
).
Это может быть не полный ответ на ваш вопрос, но я показываю вам, скорее всего, отправную точку или указатель, который может направлять вас:
ListView
выходит AbsListView
что, в свою очередь, расширяет AdapterView<ListAdapter>
. Поэтому, если вам абсолютно необходимо реализовать такое пользовательское представление с нуля, вы можете взглянуть на исходный код этих классов:
но будьте осторожны, это непростая задача. Возможно, будет достаточно использовать один из существующих классов и настроить внешний вид.
вытекающих из AdapterView
может работать, но это может быть не так полезно, как вы надеетесь. Некоторая инфраструктура, предоставляемая AdapterView
является частным пакетом, то есть у нас нет доступа к нему.
например, AdapterView
управляет индексом выбранного элемента для AbsListView
и ListView
. Однако, потому что такие методы, как setNextSelectedPositionInt(int position)
(ибо это единственный путь к установлению mNextSelectedPosition
) пакет-частный, мы не можем добраться до них. AbsListView
и ListView
может добраться до них, потому что они в одном пакете, но мы не можем.--20-->
(если вы копаете в AdapterView
Источник вы найдете, что setNextSelectedPositionInt()
вызывается из handleDataChanged()
. К сожалению handleDataChanged()
также пакет-частный и является _not_called
из любого другого места внутри AdapterView
Что может быть использовано для включения положение.)
это означает, что если вам нужно управлять выбранной позицией, вам нужно будет воссоздать эту инфраструктуру в производном классе (или вам нужно будет наследовать от ListView
или AbsListView
...хотя я подозреваю, что ты столкнуться с аналогичными проблемами, вытекающими из AbsListView
). Это также означает, что любой AdapterView
функциональность, которая вращается вокруг выбора элемента, вероятно, не будет полностью работоспособной.
вы можете создать что-то вроде этого :
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());