Подтвердить что ты не робот

Android AdapterView?

Документы говорят:

Когда контент для вашего макета является динамическим или не предопределен, вы может использовать макет, который подклассифицирует AdapterView для заполнения макета с представлениями во время выполнения. Подкласс класса AdapterView использует Адаптер для привязки данных к его компоновке.

Но большинство учебников находятся примерно в ListView, GridView, Spinner и Gallery.

Я хочу расширить подкласс непосредственно из AdapterView. Я должен создать собственное представление, что контент зависит от адаптера.

Как я могу это сделать и какие методы должны быть переопределены?

4b9b3361

Ответ 1

Во-первых, вы должны быть абсолютно уверены, что AdapterView - это то, что вы хотите, потому что не все "динамические или не заранее определенные" представления могут быть реализованы с помощью AdapterView. Иногда вам лучше создать свой вид, расширяющий ViewGroup.

если вы хотите использовать AdapterView, посмотрите этот действительно хороший пример. В GitHub есть много пользовательских представлений с адаптером. Проверьте это (extends ViewGroup).

Ответ 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());